结构体成员的内存对齐

来源:互联网 发布:皇族white淘宝店 编辑:程序博客网 时间:2024/05/21 01:29
#include <iostream>using namespace std;//#pragma pack(1) //使用#pragma pack可以将对齐设置为1/*内存对齐的3个准则:1、结构体变量的首地址能够被其最宽的基本类型成员大小所整除2、结构体每个成员相对于结构体首地址的偏移量(offset)都是这个成员大小的整数倍,如有不足则补上3、结构体总大小为结构体最宽的基本类型成员的整数倍*/struct widget1{double d;//sizeof(double)== 8int i;//sizeof(int)== 4short s;//sizeof(short)== 2char c;//sizeof(char)== 1static int count;//count是静态成员,静态成员的空间不在类的实例中,//而是像全局变量一样在静态存储区,被类共享。};int widget1::count = 0;/*对于widget1:d的偏移量为0;i的偏移量为8,是sizeof(int)的整数倍,不需补字节s的偏移量为8+4=12,是sizeof(short)的整数倍,不需补字节c的偏移量为8+4+2=14,是sizeof(char)的整数倍,不需补字节目前的结构体的字节数为8+4+2+1=15,不是最大基本变量d大小的整数倍,需要补上1字节,15+1=16所以sizeof(widget1)==16*/struct widget2{int i;//sizeof(int)== 4short s;//sizeof(short)== 2char c;//sizeof(char)== 1double d;//sizeof(double)== 8};/*对于widget2:i的偏移量为0s的偏移量为4,是sizeof(short)的整数倍,不需补字节数c的偏移量为4+2=6,也不需补字节数d的偏移量为4+2+1=7,但不是sizeof(double)的整数倍,要补字节数1,所以d的偏移量为4+2+1+1(补齐)=8目前结构体的字节数为4+2+1+1(补齐)+8=16,是最大基本变量d大小的整数倍,不需补齐所以sizeof(widget2)==16*/struct widget3{char c;//sizeof(char)== 1int i;//sizeof(int)== 4short s;//sizeof(short)== 2double d;//sizeof(double)== 8};/*对于widget2:c的偏移量为0i的偏移量为1(c的大小)+3(补齐)=4s的偏移量为1(c的大小)+3(补齐)+4(i的大小)=8d的偏移量为1(c的大小)+1(补齐)+4(i的大小)+2(s的大小)+6(补齐)=16目前结构体的大小为1(c的大小)+1(补齐)+4(i的大小)+2(s的大小)+6(补齐)+8(d的大小)=24,不需补齐所以sizeof(widget3)=24*/int main(){cout<<"the size of widget is: "<<sizeof(widget1)<<endl;cout<<"the size of widget is: "<<sizeof(widget2)<<endl;cout<<"the size of widget is: "<<sizeof(widget3)<<endl;system("pause");return 0;}

原创粉丝点击