是否值得对齐变量?
is it worth aligning variables?
我一直在阅读有关对齐变量的好处的文章。例如,在 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
进行动态对齐分配。
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- 是否值得对齐变量?
- C++11:16 字节原子<>变量是否在 16 字节边界上自动对齐,从而允许CMPXCHG16B指令?
- C++无法将对齐的字符串存储在字符串变量中并打印出来
- 指代结构与变量时对齐
- 是否存在32位变量无法正确对齐的情况
- 对齐的成员变量和动态分配
- 堆分配变量的结构成员对齐
- 查询特定变量的对齐方式
- 原子变量的对齐
- 为什么128位变量应该对齐到16字节边界
- 在c++中对齐(格式化)输出//多个变量在一行中
- C++变量地址和对齐方式 |x86
- 结构成员和静态变量的对齐
- c++ 11变量参数对齐