是否值得对齐变量?



我一直在阅读有关对齐变量的好处的文章。例如,在 C/C++ 中,堆栈上的变量可以使用__attribute__( ( aligned ( .. ) ) )对齐,堆内存可以使用std::align对齐。 如果内存对齐如此重要,为什么默认情况下不是所有编译器都自动执行此操作?至少我希望有一个 gcc/g++ 编译器标志来自动对齐所有内容。然而,情况似乎并非如此,人们仍然手动指定内存应使用上述方式对齐。为什么?是否值得使用上述对齐内存的方法或是否存在缺点?我希望在使用 -O2、-O3 标志时,会发生大量内存对齐作为优化程序的一种方式。谢谢。

默认情况下,所有编译器都进行对齐。只是在某些情况下,您希望非默认对齐。

基本类型的默认对齐方式是其大小。类类型的默认对齐方式是其所有基和数据成员的最大对齐方式。

许多实现支持(作为语言扩展(属性[[packed]],它将类型的对齐方式减少到 1,从而消除了类类型中数据成员之间的填充。这些值通常作为char[]发送和接收,与memcmp等相比。

其他时候,您可能希望增加某些特定值的对齐方式,例如作为Max的答案详细信息

这取决于你在做什么。如果您正在对向量或数组进行繁重的数学运算,那么使用自定义对齐方法将受益匪浅。例如,当您将数据与 64 个字节对齐时,您可以使用avx-512将数据以 8 个双精度块的形式直接加载到zmmm寄存器中_mm512_load_pd并对其应用SIMD指令并通过_mm512_stream_pd存储回去。 否则,如果你不做大量的矢量化计算,你只会浪费内存,正如drescherjm在他的评论中指出的那样。

进一步注意,从 C++11 开始,您可以使用alignas说明符,例如,您可以将对齐的数组定义为:

template <typename T, size_t N, size_t Alignment = 64>
struct alignas(Alignment) AlignedArray : std::array<T, N> {};

从 C++17 开始,您可以使用std::aligned_alloc进行动态对齐分配。

最新更新