C++11 内存池返回内存对齐

C++11 内存池返回内存对齐,c++11,gcc,memory-management,arm,x86-64,C++11,Gcc,Memory Management,Arm,X86 64,在我的应用程序中,我有一个内存池。我在启动时以uint64数组(64位机器)的形式分配所有内存。然后使用“新放置”在该数组中构造对象。因此,对象1从位置池[0]对象2从位置池[1]开始,依此类推。因为每个对象将跨越至少64位或多个sizeof(uint64)(如果需要分配更多uint64插槽) 我假设从池返回的所有内存都将正确对齐,对吗?因为编译器将正确对齐数组中的每个uint64。如果是这样,在32位机器上以相同的方式使用uint32是否有效?您正确地认为不会有任何填充。编译器主要以2字节或4

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


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

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

关键字
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
允许您查询对象的对齐方式,或者查询类型通常需要的最小对齐方式。它的语法与sizeof类似

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


您可以使用分配内存,然后将其强制转换为
uint64的数组

,这在很大程度上取决于您使用的编译器和内存分配器。你在用什么?对于所有C++程序,这不能在全局范围内回答。@ LIRANFANARO我的目标编译器是GCC和CLAN。不涉及分配器内存是uint64三一特定体系结构的全局数组?@LiranFunaro目前为x86_64,但我要求使用32位的原因是我也将在32位arm上运行。我希望您的意思是位置0而不是位置1。对于位置1,假设数组正确对齐,您仍然可以获得64位对齐,但可能无法获得页对齐或缓存线对齐,这两种对齐方式似乎都不可取。