第一次见到这个问题是在百度知道上,看一个人提问,但是当时发现,从来没有想过这个问题!
class A
{
int a;
}
class B
{
char b;
};
class C
{
char a;
int b;
};
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;
cout<<sizeof(C)<<endl;
大家猜猜结果是什么:
4,1,8;
大家一定会奇怪为什么最后面的那个会是8字节!
这和变量在内存中的存储形式有关(罪魁祸首是编译器),大家都知道我们所写的代码,在编译后都会变成汇编代码(也会进一步成为机器代码),
汇编吧数据设计成段栈的存储形式,为了提高访问效率,它要求每一次移动栈顶指针的步长都要相同(以空间换换时间)!
也就是说即使一个变量没有占那么多字节也要把它后面补上一些空字节来使各变量在内存上对齐!而且按照占字节最多的那个变量来对齐!
举个例子吧!
struct s
{
int i;
char j;
double b;
int a;
}
在内存上,存储这四个变量是按出现的顺序来的!首先最长的是b占8个字节,前两个一共占了5个字节,所以可以把i和j“连接成一块",然后在后面补齐3个空字节,然后写b8个字节,最后是a因为后面已经没有变量了所以他自己在后面补齐4个空字节!Ok !所以结果是24个字节!
其实这个概念后面还有一个位域位段的概念,这里就不提了!
学校还没开汇编语言,我只是凭着自己上学期看的一些栈的知识来理解,希望大家多多批评,帮我找错误,多多拍砖,如果看到我的错误而不告诉我,
你就是小坏蛋啊!O(∩_∩)O~!