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的值来告诉我基于运行机器的对齐要求?
让我直接回答你的问题:不,不需要在 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 将不对齐。
您在手册中阅读的说明是针对汇编语言程序员和编译器编写者的。
当数据未对齐时,在某些系统(非英特尔)上会导致异常,而在其他系统上则需要多个处理器周期来获取和写入数据。