zhgw01

内存对齐,little endian 和big endian

在笔试中考到,虽然认识到是内存对齐的问题,最后还是做错了,另外下面采用了big endian,一般的都是采用little endian

class Test
{
public
 
short int a;
 
int b;
 
char c[5];
public:
 Test():b(0x
1234),a(b){
  c[
0]='h';
  c[
1]='e';
  c[
2]='l';
  c[
3]='l';
  c[
4]='o'//我是绝对这里应该赋值为'\0'
}

}


int main()
{
  Test t;
  cout
<<a<<endl;
  cout
<<b<<endl;
  cout
<<sizeof(t)<<endl;
  
char* p=(char*)&t;
  cout
<<*(p+8)<<endl;
}

sizeof 那里考的就是内存对齐的问题,short int 的变量必须从模2为0的开始,int必须从模4为0 的开始,char必须从模1为0的开始,而整个Test依照它的成员中最大的,这里就是int,也就是Test的必须从模4为0的开始,而且它必须占4的倍数。
为了满足int的条件,short int后要填充(padding)两个字节,为了满足Test的条件,char[5]后必须填充3个字节,所以总共是2+2+4+5+3=16个字节
具体的内存对齐可以参考如下
英文:http://www.chinaitpower.com/2005September/2005-09-13/206312.html
中文:http://blog.ednchina.com/jasony/92132/Message.aspx
这样*(p+8)也就很容易了解了,跳过前面8个字节,即short int 的2个,填充的2个,以及int的4个,最后跳到了c[0]

little endian 和 big endian

当一个变量占多个字节时,如何排列这些字节就产生出了little endian和big endian的区别
little endian: 把低字节放在内存的低位 (The most significant byte is on the right end of a word)
big endian: 把低字节放在内存的高位 (The most significant byte is on the left end of a word)
举个例子:
     假设从地址0x00000000开始的一个字中保存有数据0x1234abcd,那么在两种不同的内存顺序的机器上从字节的角度去看的话分别表示为:
       1)little endian:在内存中的存放顺序是0x00000000-0xcd,0x00000001-0xab,0x00000002-0x34,0x00000003-0x12
       2)big  endian:在内存中的存放顺序是0x00000000-0x12,0x00000001-0x34,0x00000002-0xab,0x00000003-0xcd


在构造函数中的Test():b(0x1234),a(b)看起来有问题,本来想这应该涉及到little endian和big endian的问题,不过在vs2005里调试了一下,发现由于a比b先声明,所以实际上时a先初始化,也就是a(b)这个语句先运行,由于这时候b还没初始化,a的值就是一个随机数(相对于不同的运行来说),接着b再初始化为正确值,但是这时候已经无法改变a的值了

posted on 2008-10-27 17:17 apacs 阅读(554) 评论(0)  编辑 收藏 引用 所属分类: c++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


My Links

Blog Stats

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜