内存对齐

来源:互联网 发布:管家婆数据导入失败 编辑:程序博客网 时间:2024/05/22 13:19

在结构体中,成员数据对齐满足以下规则:

a、结构体中的第一个成员的首地址也即是结构体变量的首地址。

b、结构体中的每一个成员的首地址相对于结构体的首地址的偏移量(offset)是该成员数据类型大小的整数倍。

c、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

d、结构体的总大小是对齐模数(结构体中最大数据类型的成员大小)的整数倍。(对齐模数等于#pragma pack(n)所指定的n与结构体中最大数据类型的成员大小的最小值)

#include<iostream>using namespace std;class A{public:int a; //0char b;//5    1的整数倍(1)char d;//6 int c; //8    4的整数倍(4)};   //最终大小为12,提现的是成员变量相对首地址的偏移必须是其大小的整数倍class B{public:int a;  //0char b; //5int c;  //8 4的整数倍char d; //13};//最终大小是16,体现了结构体最终大小是模数的整数倍(模数是最大的成员变量和#pragma pack(n)中的最小值)class C{public:int a;   //0double b;//8int c;   //16char d;  //20}; //最终大小是模数的整数倍 24class D{public:int a; //0C c;   //8(整体24) 当结构体作为成员,按照结构体最大的数据类型进行对其,因此c按照8处理int b; //32};//最终大小是40,b结束在36,但模数是8,所以为40int main(){A aa;cout << sizeof(aa) << endl;B bb;cout << sizeof(bb) << endl;C cc;cout << sizeof(cc) << endl;D dd;cout << sizeof(dd) << endl;system("pause");return 0;}


原创粉丝点击