内存在使用过程并不是单一的依次排列,而是按照某种既定的规则来进行对齐,以方便快速访问
内存的对齐原则有以下三条:
- 数据成员对齐:成员根据其自身大小,从自身大小的整数倍内存地址(以第一个元素存储在0位置为参考)开始存储
- 结构体成员对齐:如果包合了结构体成员,则结构体成员的存储位置从其内部成员最大值的整数倍地址开始存储
- 结构体总大小对齐:必须要是其内部最大成员的整数倍,不足的要补齐
结构体内成员按照声明顺序存储,第一个成员地址和整个结构体地址相同。
未特殊说明时,按结构体中size最大的成员对齐(若有double成员,按8字节对齐。)
c++11以后引入两个关键字 alignas与 alignof。其中 alignof 可以计算出类型的对齐方式, alignas 可以指定结构体的对齐方式
若 alignas 小于自然对齐的最小单位,则被忽略。
offsetof
可以方便查看成员变量在结构体中的偏移量
方便学习结构体内存对齐
#include<iostream>
#include<stddef.h>
#include<bits/stdc++.h>
using namespace std;
struct alignas(4) Info2{uint8_t a;uint32_t b;uint16_t c;//uint16_t d;
}mys;int main(){cout<<sizeof(Info2)<<endl;Info2 temp;int offset_a = offsetof(Info2, a);int offset_b = offsetof(Info2, b);int offset_c = offsetof(Info2, c);//int offset_d = offsetof(Info2, d);cout << "Offset of a: " << offset_a << endl;cout << "Offset of b: " << offset_b << endl;cout << "Offset of c: " << offset_c << endl;//cout << "Offset of d: " << offset_d << endl;return 0;
}