为什么
28字节的初始值低至1?
我相信@bgusach完全回答了这一点;Python使用
C结构来表示Python世界中的对象,包括
ints的任何对象:
struct _longobject { PyObject_VAR_HEAD digit ob_digit[1];};
PyObject_VAR_HEAD是一个宏,在展开时会在结构中添加另一个字段(该字段
PyVarObject专门用于具有某种长度概念的对象),并且
ob_digits是一个保存数字值的数组。锅炉板大小来自于结构,为小型
和 大型Python号码。
为什么增加
4字节?
因为,当创建更大的数字时,大小(以字节为单位)是
sizeof(digit);的倍数。您可以看到,在
_PyLong_New其中使用以下命令
longobject执行新的内存分配
PyObject_MALLOC:
if (size > (Py_ssize_t)MAX_LONG_DIGITS) { PyErr_SetString(PyExc_OverflowError, "too many digits in integer"); return NULL;}result = PyObject_MALLOC(offsetof(PyLongObject, ob_digit) + size*sizeof(digit));
offsetof(PyLongObject, ob_digit)是与保持其值无关的长对象的“模板”(以字节为单位)。
digit在头文件保持被定义
struct _longobject为
typedef为
uint32:
typedef uint32_t digit;
并且
sizeof(uint32_t)是
4字节。这是当
size参数to
_PyLong_New增大时您将看到的大小(以字节为单位)增加的数量。
当然,这就是
CPython选择实现它的方式。这是一个实现细节,因此您不会在PEP中找到太多信息。如果您可以找到相应的线程:-),则python-
dev邮件列表将包含实现讨论。
无论哪种方式,您都可能在其他流行的实现中发现不同的行为,因此请不要认为这是理所当然的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)