目录
什么是内存对齐
类的成员的存储规则
怎么进行内存对齐(介绍规则与例子讲解)
什么是内存对齐
内存对齐是指将数据存储在内存中时,按照一定的规则让数据排列在规定的地址上,以提高数据访问的效率和速度。在C++中,结构体(类)内部的每一个成员变量都需要存储到内存中,因此需要进行内存对齐以保证内存的访问效率。
类的成员的存储规则
成员变量存放在系统分配的对象内存中,成员函数存放在公共的代码段,所以计算类的大小是要计算成员变量(不包括static成员变量,他是存放在全局数据区的)就行,不需要计算成员函数。
怎么进行内存对齐(介绍规则与例子讲解)
1.第一个成员从在与对象偏移量为0的地址处开始存放。
以下面代码为例:
class Student { public://... private:char c;int i; }; int main() {class Student s;cout << sizeof(s) << endl;return 0; }
第一个成员变量存放位置如图:
2.其他成员变量要对齐到对齐数的整数倍的地址处
对齐数=编译器默认(或自定义)的一个对齐数与该成员变量的大小(字节)的较小值。
注意:VS中默认的值为8第二个成员变量存放位置如图:
3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。注意:此最大对齐数不得超过编译器的默认对齐数。最终结果为:
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。以此代码为例:
class Student { public://... private:double d; };class person { public://... private:char c;int i;Student s; };int main() {class person p;cout << sizeof(p) << endl;return 0; }
最终结果为下图:
5.自定义对齐数:#pragma pack (n):n为你想要设置的对齐字节数。
代码和上面(第四点)的代码一样,但将编译器的默认对齐数改为四结果就不一样了
代码:
#pragma pack (2)class Student { public://... private:double d; };class person { public://... private:char c;int i;Student s; };int main() {class person p;cout << sizeof(p) << endl;return 0; }
结果为下图: