我创建了一个实验来测试整数列表的内存分配:
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个字节。
为什么有区别?
答案 0 :(得分:2)
内存中的结构可以是28个字节长,并可以在8个字节的边界上分配。在64位处理器中,您希望所有指针都位于8字节边界上,因此要分配28字节的结构,以便它们的起始地址相隔32个字节。
答案 1 :(得分:2)
对齐方式。所有C结构都是对齐的,因此要遵守一些约束(它们对于每个处理器都是特定的,但基本上,您希望您的类型与内存总线的大小对齐,以便对它们进行一次访问)。
在这种情况下,您将对齐8个字节(例如,默认为gcc),因此28个字节的大小会“碰撞”到实际使用的32个字节。