内存是否分配给 CPython 中堆栈上的指针?
Is memory allocated to pointers on the stack in CPython?
(CPython 实现)
在 x = 3
中,我知道包含原始值 3
的 int
对象的内存分配在堆上。 x
(作为对int对象的引用)分配在栈上还是堆上?
CPython 实现中的对象分配在堆上,“堆栈帧”也是如此。 “堆栈帧”大小在编译时预先计算。
然而,由于我不是 100% 清楚的原因,有一个 C 堆栈用于嵌套函数调用(但是不适用于参数或局部变量)。这仍然意味着 CPython 上的无限递归将崩溃,因为 C 堆栈耗尽远早于 运行 内存不足。无论 Python 代码中的调用嵌套有多深,都可以实现 VM 使用固定数量的 C 堆栈,但事实并非如此。
另请注意,小整数(例如 3
)是共享的,即并不总是分配新的整数对象。作为整数不可变,这很难注意到,除非使用 id
,但出于速度原因这是一个重要的优化。
(CPython 实现)
在 x = 3
中,我知道包含原始值 3
的 int
对象的内存分配在堆上。 x
(作为对int对象的引用)分配在栈上还是堆上?
CPython 实现中的对象分配在堆上,“堆栈帧”也是如此。 “堆栈帧”大小在编译时预先计算。
然而,由于我不是 100% 清楚的原因,有一个 C 堆栈用于嵌套函数调用(但是不适用于参数或局部变量)。这仍然意味着 CPython 上的无限递归将崩溃,因为 C 堆栈耗尽远早于 运行 内存不足。无论 Python 代码中的调用嵌套有多深,都可以实现 VM 使用固定数量的 C 堆栈,但事实并非如此。
另请注意,小整数(例如 3
)是共享的,即并不总是分配新的整数对象。作为整数不可变,这很难注意到,除非使用 id
,但出于速度原因这是一个重要的优化。