关于内存对齐

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个字节!


转自:http://www.cppleyuan.com/viewthread.php?tid=680&highlight=内存对齐
posted @ 2011-12-16 11:42  杨溪  阅读(301)  评论(0编辑  收藏  举报