0%

结构体对齐

结构体对齐

写在前面

    结构体对齐一直是一个老生常谈的问题,我面试过就被问过几次,但是每一次都复习准备好好的,但是一到面试时候,总能被面试官问倒(卑微~)其实主要的原因就是自己没有准确的深刻的理解结构体对齐这个知识点,没有对其进行一个总结。

为什么需要结构体对齐

    结构体需要对其的原因主要就是对CPU对内存访问效率优化的一个问题。假设是intel 32的CPU, 每个总线周期都是要从偶地址读取32位的内存数据。

假设我们的CPU和总线都是64位的,每次可以从内存中获取8个字节(Byte)64位(bit)的数据,这8个字节就是对齐的,假设就是07,815类似这样,你不能从中间310这样取值。如果需要取值310之间的数据,就需要取两次,分别是07,再取815。所以CPU的取值效率就下降了。

对齐的几个基本的原则

1、结构体变量的起始地址能够被其最宽的成员大小整除。

2、结构体每个成员相对于起始地址的偏移能够被自身大小整除,如果不能则在前一个成员后面补充字节。

3、结构体总的大小能够被最宽的成员大小整除,如果不能则是在后面进行一个补齐。

结构体其实也是可以指定编译器对齐大小的,例如以下的代码

1
2
3
4
5
6
7
8
9
#pragma pack(1)
struct A{
char a;
int b;
char c;
};
#pragma pack()

struct A a;

sizeof(a)的大小为5。

几种变形情况

1
2
3
4
5
struct A{
char a;
int b;
short c;
}A1;

变量a,自身按1字节对齐,

未完待续~

Reference

[1] https://www.zhihu.com/question/27862634

[2] https://cloud.tencent.com/developer/article/1055149?from=information.detail.linux%E7%BB%93%E6%9E%84%E4%BD%93%E5%AF%B9%E9%BD%90

小主,路过打个赏再走呗~