C/C++ 结构体内存对齐

    内存对齐是指的是编译器在编译的时候总是会将结构体的元素的地址放在一些合适的位置使得CPU访问这些数据的效率变得更高。首先来看下面这个例子:

struct A
{
char a;
char b;
int c;
};
struct B
{
char a;
int b;
char c;
};

sizeof(A) = ?      sizeof(B) = ?

正确的结果应该是sizeof(A) = 8,sizeof(B) = 12。因为CPU在访问这些数据的时候,每次只能读一定长度的数据,在这里,假如struct B中a的地址0,b的地址是1,c的地址是5,那么,当CPU要访问b的时候,会这样访问,首先访问0-3,取前三个字节,然后再访问4 - 7,然后只取第一个字节,把两次访问的汇总起来才得到所要的b。而CPU访问内存其实是比较慢的,而如果我把这三个元素的地址设置成如下:&a = 0  ,  &b = 4,&c = 8,那么这是CPU访问b的话,就只要访问一次了,大大提高访问的效率。所以编译器在进行编译的时候都会做这个优化,按照占用字节数最长的元素来进行对齐处理。这个优化对于程序员来说是透明的,然而C/C++总是这么灵活,我们也可以手动干预来按照自己的需要设置对齐的方式,那就是用#pragma pack(n),这样就是按照n个字节来对齐。所以,上面两个例子如果在前面加上#pragma pack(1),那么两个结果都将会是6.

原文地址:https://www.cnblogs.com/xiaxiaosheng/p/4356963.html