文章目录
- 介绍
- 对齐数
- 顺序问题
- 结构体有效对齐数计算
- 数组对齐
介绍
结构体的大小并不是简单地将每个结构体成员的大小相加就能得到。
cpu一次能读取多少内存要看数据总线是多少位,如果是16位,则一次只能读取2个字节,如果是32位,则可以读取4个字节,并且cpu不能跨内存区间访问。
三个原则:
1、第一个成员的首地址为0.
2、每个成员的首地址是自身大小的整数倍
3、结构体的总大小,为其成员中所含最大类型的整数倍。
对齐数
对齐数 = 该结构体成员变量自身的大小与编译器默认的一个对齐数的较小值。
顺序问题
结构体成员变量的顺序不同,可能会造成内存不必要的损失。将占用空间小的成员尽量集中在一起,可以有效地避免内存不必要的浪费。
结构体有效对齐数计算
结构体对齐数 == min{成员最大对齐数, 编译器默认对齐数}
可以通过调用C++标准库 alignof 函数来获取结构体的默认对齐数。alignof 函数将返回以字节为单位的给定类型的对齐要求。
#include <iostream>
struct MyStruct {
int a;
char b;
double c;
};
int main() {
std::cout << alignof(MyStruct) << std::endl; // 输出结构体的默认对齐数8
return 0;
}
数组对齐
数组在内存中存储时是分开存储的,char类型的数组每个元素是 1Byte,内存对齐时按照单个元素进行对齐。
结构体内存对齐(如何计算结构体的大小)
如何理解 struct 的内存对齐?
C语言 | 关于结构体内存对齐,看这篇就够了
C/C++中内存对齐问题的一些理解