为什么整数的存储位置会跳32个字节?

时间:2018-10-21 14:07:31

标签: python macos

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

In [9]: [id(i) for i in range(10)]                                                                                
Out[9]: 
[4531258400,
 4531258432,
 4531258464,
 4531258496,
 4531258528,
 4531258560,
 4531258592,
 4531258624,
 4531258656,
 4531258688]

这似乎表明每个整数占用32个字节,但是当我使用sys.getsizeof()时:

In [13]: [sys.getsizeof(i) for i in range(10)]                                                                    
Out[13]: [24, 28, 28, 28, 28, 28, 28, 28, 28, 28]

则整数占用的字节数少于32个字节。

为什么有区别?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

对齐方式。所有C结构都是对齐的,因此要遵守一些约束(它们对于每个处理器都是特定的,但基本上,您希望您的类型与内存总线的大小对齐,以便对它们进行一次访问)。

在这种情况下,您将对齐8个字节(例如,默认为gcc),因此28个字节的大小会“碰撞”到实际使用的32个字节。