在我的应用程序中,我有一个内存池。我在启动时以uint64
数组(64位机器)的形式分配所有内存。然后使用placement new在此数组中构造对象。因此,对象1从位置pool[0]
开始,对象2从位置pool[1]
开始,依此类推。由于每个对象将至少跨越64位或sizeof(uint64)
的倍数(如果需要更多uint64
个插槽来分配)。
我是否正确假设从池中返回的所有内存都将正确对齐?由于数组中的每个uint64
都将由编译器正确对齐。如果是这样,在32位机器上以相同方式使用uint32
是否有效?
答案 0 :(得分:2)
你认为没有任何填充是正确的。编译器主要以2字节或4字节边界打包(这可以控制)。
您应该使用__alignof__
在您的特定目标上验证这一点。
关键字
__alignof__
允许您查询对象的对齐方式,或类型通常所需的最小对齐方式。它的语法就像sizeof。
但是,如果从32位偏移地址开始分配数组,则8字节的分配可能不会与64位对齐。
您可以使用aligned_alloc(8, size)
分配内存,然后将其转换为uint64
数组。