gpt4 book ai didi

python - 为什么有的函数参数存放在栈上,有的存放在堆上?

转载 作者:行者123 更新时间:2023-12-01 05:06:58 25 4
gpt4 key购买 nike

我正在阅读“灰帽Python”。本书教授调试技术,您可以通过调试器更改变量值。

在下面的代码中,作者教我们如何更改counter变量值。但我想做更多,所以我将 'Hello' 参数添加到 printf 函数中,这样我就可以将其更改为其他内容,例如 'Bye'.

我通过调试器发现'Hello'存储在堆上。 Stack中保存的是Heap中存放'Hello'的地址;为什么?

我的问题是:有些参数存储在堆栈上而有些参数存储在堆上的依据是什么?

from ctypes import *
import time

msvcrt = cdll.msvcrt
counter = 99999999

while 1:
msvcrt.printf("Loop iteration %d!\n" , counter, "Hello")
time.sleep(2)
counter += 1

最佳答案

这些东西在calling conventions中定义。 (这是 ABI 的一部分)。调用约定定义了一些内容,例如:

  • 在何处(堆栈或寄存器)以及如何(在单个单元格中、分布在多个单元格中、引用堆)存储参数,
  • 存储参数的顺序(从左到右或从右到左),
  • 谁负责在调用后清理堆栈(调用者或被调用者),
  • 应保留哪些寄存器。

多年来,32 位 x86 处理器使用了一堆略有不同的调用约定(名称如 cdeclstdcallfastcall )。对于 64 位 x86 处理器,基本上有 only two calling conventions (一种由微软使用,一种由地球上的其他人使用)。

在 32 位 Windows 上,printf 使用 cdecl 约定。在 64 位 Windows 上,printf 使用 Microsoft 64 位 ABI 的调用约定。

有关调用约定的更多信息可以在 this answer 中找到。 .

关于python - 为什么有的函数参数存放在栈上,有的存放在堆上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24825071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com