C++内存对齐

来源:互联网 发布:移动硬盘保护软件 编辑:程序博客网 时间:2024/06/09 12:46

请牢记以下3条原则:(在没有#pragma pack宏的情况下)

1、数据成员对齐规则:结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,之后的每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机子上为4字节,所以要从4的整数倍地址开始存储)。

2、结构体作为成员:如果一个结构体里同时包含结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(如struct a里有struct b,b里有char,int ,double等元素,那么b应该从8(即double类型的大小)的整数倍开始存储)。

3、结构体的总大小:即sizeof的结果。在按之前的对齐原则计算出来的大小的基础上,必须还得是其内部最大成员的整数倍,不足的要补齐(如struct里最大为double,现在计算得到的已经是11,则总大小为16)。


#include <iostream>using namespace std; struct X1{  int i;//4个字节  char c1;//1个字节  char c2;//1个字节 }; struct X2 {  char c1;//1个字节  int i;//4个字节  char c2;//1个字节 };struct X3{   char c1;//1个字节   char c2;//1个字节   int i;//4个字节   static int t;   static double t1; };int X3:: t =0;double X3:: t1 =0.0;struct X4 {int a;  char b; short c; char d;  };struct inner  {  char      c1;  double   d;  char     c2;  };   int main() {       cout<<"long "<<sizeof(long)<<"\n";cout<<"long long"<<sizeof(long long)<<endl;cout<<"double"<<sizeof(double)<<endl;    cout<<"int "<<sizeof(int)<<"\n";    cout<<"char "<<sizeof(char)<<"\n";     X1 x1;    X2 x2;    X3 x3;X4 x4;    cout<<"x1 的大小 "<<sizeof(x1)<<"\n";    cout<<"x2 的大小 "<<sizeof(x2)<<"\n";    cout<<"x3 的大小 "<<sizeof(X3)<<"\n";cout<<"x4 的大小 "<<sizeof(x4)<<"\n";cout<<"inner 的大小 "<<sizeof(inner)<<"\n";    return 0; }


0 0
原创粉丝点击