是否需要明确的对齐?

use*_*285 6 c++ memory alignment padding

在一些读数之后,我理解编译器已经对结构或类进行了填充,以便可以在其自然对齐的边界上访问每个成员.那么在什么情况下编码人员需要明确调整以获得更好的性能?我的问题来自于此:

英特尔64和IA-32 Architechtures参考手册:

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.
Run Code Online (Sandbox Code Playgroud)

所以假设我有一个结构:

struct A
{
    int a;
    int b;
    int c;
}
// size = 12;
// aligned on boundary of: 4
Run Code Online (Sandbox Code Playgroud)

通过创建A类型的数组,即使我什么都不做,它也是正确对齐的.那么遵循指南并使对齐更强的重点是什么?

是因为缓存线分裂?假设缓存行是64字节.在数组中第6次访问对象时,字节从61开始到72,这会减慢程序的速度?

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

use*_*003 2

让我直接回答你的问题:不,不需要在 C++ 中显式对齐数据以提高性能。

任何像样的编译器都会正确地调整底层系统的数据。

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

 struct 
 {
     int w ;
     char x ;
     int y ;
     char z ;
 } 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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