我一直在阅读有关对齐变量的好处的文章。例如,在C / C ++中,可以使用__attribute__( ( aligned ( .. ) ) )
对齐堆栈上的变量,而可以使用std::align
对齐堆内存。
如果内存对齐非常重要,为什么不是所有编译器默认都会自动执行呢?至少我会期望有一个gcc / g ++编译器标志来自动对齐所有内容。但是,情况似乎并非如此,人们仍然手动指定应该使用上述方式对齐内存。这是为什么?使用上述对齐内存的方式值得还是存在弊端?我希望使用-O2,-O3标志时,会发生大量内存对齐,这是优化程序的一种方式。谢谢。
答案 0 :(得分:4)
默认情况下,所有编译器执行对齐。只是在某些情况下,您需要非默认对齐方式。
基本类型的默认对齐方式是它的大小。类类型的默认对齐方式是所有基类和数据成员的最大对齐方式。
许多实现都支持(作为语言扩展)属性[[packed]]
,该属性{em>减少将类型对齐为1,从而消除了类类型中数据成员之间的填充。与char[]
等相比,此类值通常以memcmp
的形式发送和接收。
有时您可能希望增加某些特定值的对齐方式,例如作为Max's answer的详细信息
答案 1 :(得分:3)
这取决于您在做什么。如果要对向量或数组进行繁重的数学运算,则使用自定义对齐方式会大大受益。例如,使用avx-512
对齐64字节的数据时,可以通过zmmm
在{{1}并将其通过_mm512_load_pd
存储回来。
否则,如drescherjm在他的comment中指出的那样,如果不进行繁重的矢量化计算,您只会浪费内存。
还要注意,自C ++ 11起,您可以使用alignas
specifier,例如您可以将对齐的数组定义为:
SIMD
自C ++ 17起,您可以使用std::aligned_alloc
进行动态对齐分配。