内存对齐问题(原创)(看完记得回帖)

第一次见到这个问题是在百度知道上,看一个人提问,但是当时发现,从来没有想过这个问题!

 

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~!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值