今天接到一个电话面试,被问到这个问题,很自信的回答却被嘲讽了,naive,还是自己没有掌握透彻,今天就好好八一八这玩意儿。
面试问我的是这样的一个结构体的大小(sizeof)
struct A{
char c;
double d;
int a;
};
我回答4+8+4=16,结果面试官让我自己敲一敲试一试。
自己VS2013试了一下还真是错的,是24
百度了下,这篇博文(点击打开链接)讲得挺清楚,自己看了看,总结一下:
1、如果编译器不指定自定义的对齐方式的话,编译器按照默认的方式对齐
默认的方式是指什么呢?vc和vs里面是按照8字节对齐,g++里面是按照4字节对齐
具体点说,默认的对齐方式指当前要存储的这个成员变量的大小要能整除当前的偏移量(相对于结构变量首地址的)。
最后,所有的字节数相加要是成员变量里面最大的那个变量的大小的倍数(比如有一个8字节的变量,对齐之后总共占20个字节,那么需要补4个够8的倍数到24)
注意C++里面最大的默认数据类型的大小为8(int 4,long4,long long 8, float 4, double 8)
2、如果指定了n字节对齐的方式,比如4字节对齐。那么如果n大于下一个要存的成员变量的大小,按n对齐,否则按成员变量的大小对齐(或者说是默认的方式对齐)
最后,所有的字节数相加要是n的倍数(vs默认的为8)
所以,回顾我自己的那一道面试题,我计算的时候是按照4字节对齐算的,8字节对齐的时候结果不一样。
同时,我自己思考了一下,如果一个结构体的成员变量是另一个结构体会怎么样呢?
做了个实验:
感觉就像是将AA里面的成员变量直接贴在那个位置之后算出来的结果
说明,并不是按照AA(最大的成员变量)的大小来对齐(16*2),而是按照基本类型对齐
本文通过一道面试题探讨了结构体在不同编译器中如何进行内存对齐,解释了为何同样结构体在不同对齐设置下大小不同,并通过实例展示了嵌套结构体的情况。
344

被折叠的 条评论
为什么被折叠?



