代码之家  ›  专栏  ›  技术社区  ›  Wizard

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

  •  0
  • Wizard  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  2
  •   Ned Batchelder    6 年前

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

        2
  •  2
  •   Matthieu Brucher    6 年前

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

    在本例中,您是在8个字节上对齐的(例如,gcc的默认值),所以28个字节的大小被“缓冲”到实际使用的32个字节。