内存池返回内存对齐

时间:2017-05-21 20:07:31

标签: c++11 gcc memory-management arm x86-64

在我的应用程序中,我有一个内存池。我在启动时以uint64数组(64位机器)的形式分配所有内存。然后使用placement new在此数组中构造对象。因此,对象1从位置pool[0]开始,对象2从位置pool[1]开始,依此类推。由于每个对象将至少跨越64位或sizeof(uint64)的倍数(如果需要更多uint64个插槽来分配)。

我是否正确假设从池中返回的所有内存都将正确对齐?由于数组中的每个uint64都将由编译器正确对齐。如果是这样,在32位机器上以相同方式使用uint32是否有效?

1 个答案:

答案 0 :(得分:2)

你认为没有任何填充是正确的。编译器主要以2字节或4字节边界打包(这可以控制)。 您应该使用__alignof__在您的特定目标上验证这一点。

  

关键字__alignof__允许您查询对象的对齐方式,或类型通常所需的最小对齐方式。它的语法就像sizeof。

但是,如果从32位偏移地址开始分配数组,则8字节的分配可能不会与64位对齐。

您可以使用aligned_alloc(8, size)分配内存,然后将其转换为uint64数组。