字节对齐
为什么要字节对齐
https://www.jb51.net/article/84553.htm 1. 不同硬件兼容性。一些平台对某些特定类型的数据只能从某些特定地址开始存取 2. 避免内存需要两次访问才能把一个数据完整的读写
alignas 关键字 实现结构体字节对齐
- 直接用在struct 关键字的后面加上 alignas(N), N
表示整个结构体中所有变量的最大对齐值, 如果N 小于各个变量的实际大小, 那么
alignas 将被忽略
1
2
3
4
5
6
7
8
9
10
11
12
13struct alignas(8) Base {
int a;
char b;
int c;
};
// size = 16
struct alignas(2) Base {
int a;
char b;
int c;
};
// size = 12 - 用在结构体中的单个变量上, 表示该变量的对齐值。如果前面的变量使用了
alignas, 后面的变量没使用或者使用对齐值更小,那么都以前面的对齐值为准,
并且在对齐范围内包含后面的变量;如果后面对齐值比前面大,那么则从新开始计算对齐地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17struct BaseSep {
alignas(64) int a;
char b;
};
// size = 64
struct BaseSep {
alignas(64) int a;
alignas(32) char b;
};
// size = 64
struct BaseSep {
alignas(64) int a;
alignas(64) char b;
};
// size = 128
attribute((aligned (n))) 方式的
pack(N) 方式
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!