sizeof求struct、指针、数组的大小

来源:互联网 发布:淘宝热词搜索排行 编辑:程序博客网 时间:2024/04/28 15:38
#include <iostream>using namespace std;//http://blog.sina.com.cn/s/blog_48d8ae76010002g4.html/**为什么需要字节对齐?计算机组成原理教导我们,这样有助于加快计算机的取数速度,否则就得多花指令周期了。为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上。以此类推,这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:    1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;    2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);    3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。    结构体某个成员相对于结构体首地址的偏移量可以通过宏offsetof()来获得    这个宏也在stddef.h中定义,如下:#define offsetof(s,m) (size_t)&(((s *)0)->m)例如,想要获得S2中c的偏移量,方法为size_t pos = offsetof(S2, c);// pos等于4由于结构体的成员可以是复合类型,比如另外一个结构体,所以在寻找最宽基本类型成员时,应当包括复合类型成员的子成员,而不是把复合成员看成是一个整体。但在确定复合类型成员的偏移位置时则是将复合类型作为整体看待。*//**在GCC中,对齐模数的准则是:对齐模数最大只能是4,也就是说,即使结构体中有double类型,对齐模数还是4,所以对齐模数只能是1,2,4。而且在上述的三条中,第2条里,offset必须是成员大小的整数倍,如果这个成员大小小于等于4则按照上述准则进行,但是如果大于4了,则结构体每个成员相对于结构体首地址的偏移量(offset)只能按照?是4的整数倍来进行判断是否添加填充。*/struct node{int i;//4int j;//4int ij;//4-->8,补4----使d的首地址偏移量%double大小=0double d;//8char c;//1-->4,补3----使p的首地址偏移量%node *大小=0node *p;//4};//VC----4+4+4+4+8+4+4 = 32//GCC----4+4+4+4+8+4+4 = 32/**struct node{int i;//4--补4----使d的首地址偏移量%double大小=0double d;//8char c;//1-->4,补3----使p的首地址偏移量%node *大小=0node *p;//4};*///vc---4+4+8+4+4=24//gcc---4+4+8+4+4=24----与VC不同的是,GCC中,对齐模数的准则是:对齐模数最大只能是4,int main(){//数组名,非指针,sizeof所求是数组元素的数目int temp[9]={0,1,2,3,4,5,6,7,8};cout<<"int temp[9],sizeof: "<<sizeof(temp)<<endl;//4*9//32位计算机,指针大小为4个字节,无论指针是什么类型。int *pt = temp;cout<<"int *pt = temp,sizeof: "<<sizeof(pt)<<endl;//4int *ptem = new int[9];for(int i=0; i<9; i++){ptem[i] = i;}cout<<"int *ptem = new int[9],sizeof: "<<sizeof(ptem)<<endl;//4double *ptemd = new double[9];for(int i2=0; i2<9; i2++){ptemd[i2] = i2;}cout<<"double *ptemd = new double[9],sizeof: "<<sizeof(ptemd)<<endl;//4//struct node结构的大小cout<<"struct node,sizeof: "<<sizeof(node)<<endl;////仍然是指针的大小node *pn = new node;cout<<"node *pn,sizeof: "<<sizeof(pn)<<endl;//4return 1;}

原创粉丝点击