Python 为什么整数的内存位置会跳转32字节?

Python 为什么整数的内存位置会跳转32字节?,python,macos,Python,Macos,我创建了一个实验来测试整数列表的内存分配: In [9]: [id(i) for i in range(10)] Out[9]: [4531258400, 4531258432, 4531258464, 4531258496, 4531258528, 4531258560, 4531258592, 4531258624,

我创建了一个实验来测试整数列表的内存分配:

In [9]: [id(i) for i in range(10)]                                                                                
Out[9]: 
[4531258400,
 4531258432,
 4531258464,
 4531258496,
 4531258528,
 4531258560,
 4531258592,
 4531258624,
 4531258656,
 4531258688]
这似乎表明每个整数需要32个字节,但当我使用
sys.getsizeof()
时:

那么整数的长度小于32字节


为什么会有差异?

内存中的结构可以有28字节长,并且可以在8字节边界上分配。在64位处理器中,您希望所有指针都位于8字节边界上,因此分配28字节结构,使其起始地址相隔32字节。

内存中的结构可以是28字节长,并在8字节边界上分配。在64位处理器中,您希望所有指针都位于8字节边界上,因此分配28字节结构,使其起始地址相隔32字节。

对齐。所有的C结构都是对齐的,这样一些约束就得到了尊重(它们是特定于每个处理器的,但基本上,您希望您的类型与内存总线大小对齐,这样它们就可以通过一次访问来加载)


在本例中,您是按8个字节对齐的(例如gcc的默认值),因此28个字节的大小会“突增”到实际使用的32个字节。

对齐。所有的C结构都是对齐的,这样一些约束就得到了尊重(它们是特定于每个处理器的,但基本上,您希望您的类型与内存总线大小对齐,这样它们就可以通过一次访问来加载)


在本例中,您是按8字节对齐的(例如gcc的默认值),因此28字节的大小会“突增”到实际使用的32字节。

我无法理解“您是按8字节对齐的”,8是如何计算出来的?这是特定于体系结构和编译器的。例如,在x86_64和gcc上,它是8个字节(64位),我无法理解“您在8个字节上对齐”,8是如何计算出来的?它是特定于体系结构和编译器的。例如,在x86_64和gcc上,它是8字节(64位)
[id(i)代表范围(10)中的i]
并不能真正告诉您大小,尽管存在相关性。事实上,您只是在猜测。
[id(i)for i in range(10)]
并没有真正告诉您大小,尽管存在相关性。事实上,你只是在猜测。所以列表是一个列表数组?我不知道你所说的“列表数组”是什么意思?对不起,它是一个链接数组吗?@riderdragon也许你是指链接列表。不,Python中的列表是内存中连续的对象引用,就像其他语言中的数组一样。所以列表是一个列表数组?我不知道你所说的“列表数组”是什么意思?对不起,是链接数组吗?@riderdragon也许你指的是链接列表。不,Python中的列表是内存中连续的对象引用,就像其他语言中的数组一样。
In [13]: [sys.getsizeof(i) for i in range(10)]                                                                    
Out[13]: [24, 28, 28, 28, 28, 28, 28, 28, 28, 28]