c++ - 是否需要显式对齐?

标签 c++ memory alignment padding

经过一些阅读,我了解到编译器已经对结构或类进行了填充,以便可以在其自然对齐边界上访问每个成员。那么在什么情况下编码人员需要显式对齐以获得更好的性能呢?我的问题来自这里:

Intel 64 和 IA-32 架构优化引用手册:

For best performance, align data as follows:
Align 8-bit data at any address.
Align 16-bit data to be contained within an aligned 4-byte word.
Align 32-bit data so that its base address is a multiple of four.
Align 64-bit data so that its base address is a multiple of eight.
Align 80-bit data so that its base address is a multiple of sixteen.
Align 128-bit data so that its base address is a multiple of sixteen.

假设我有一个结构:

struct A
{
    int a;
    int b;
    int c;
}
// size = 12;
// aligned on boundary of: 4

通过创建类型 A 的数组,即使我什么都不做,它也会正确对齐。那么遵循指南并使对齐更牢固的意义何在?

是因为cache line split吗?假设缓存行是 64 字节。第 6 次访问数组中的对象时,字节从 61 开始到 72,这会减慢程序速度??

顺便说一句,标准库中是否有一个宏通过返回 std::size_t 的值告诉我基于运行机器的对齐要求?

最佳答案

让我直接回答你的问题:不,没有必要为了性能而在 C++ 中显式对齐数据。

任何体面的编译器都会为底层系统正确对齐数据。

如果您有以下问题,问题就会出现(上面的变体):

 struct 
 {
     int w ;
     char x ;
     int y ;
     char z ;
 } 

这说明了两个常见的结构对齐问题。

(1) 编译器很可能会在 x 和 z 之后插入 (2) 3 个对齐字节。如果 x 后没有填充,则 y 未对齐。如果 z 之后没有填充,w 和 x 将在数组中不对齐。

您在手册中阅读的说明是针对汇编语言程序员和编译器编写者的。

当数据未对齐时,在某些系统(不是 Intel)上它会导致异常,而在其他系统上则需要多个处理器周期来获取和写入数据。

关于c++ - 是否需要显式对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25290538/

相关文章:

android - 在 Galaxy S2 上进行 Android 更新后内存不足

swiftui - 如何对齐 View 底部尾随,覆盖在 SwiftUI 中剪辑在屏幕边缘的另一个 View 上?

c# - WPF 窗口在关闭后不释放内存

r - 将网格一侧的 R 图的轴对齐

wpf - 在 RibbonGroup 内水平拉伸(stretch) WPF 网格

c++ - 避免复制粘贴代码初始化结构中的一系列 SDL_Rect

c++ - 大数组大小 C++ 的问题

c++ - 从文件中读取数据,文件名作为输入

c++ - while 函数中的无限循环

java - 在 Tomcat 6 中重复出现 "PermGen"