內(nèi)存對(duì)齊,little endian 和big endian
在筆試中考到,雖然認(rèn)識(shí)到是內(nèi)存對(duì)齊的問(wèn)題,最后還是做錯(cuò)了,另外下面采用了big endian,一般的都是采用little endian
class Test


{
public;
short int a;
int b;
char c[5];
public:

Test():b(0x1234),a(b)
{
c[0]='h';
c[1]='e';
c[2]='l';
c[3]='l';
c[4]='o'; //我是絕對(duì)這里應(yīng)該賦值為'\0'
}
}

int main()


{
Test t;
cout<<a<<endl;
cout<<b<<endl;
cout<<sizeof(t)<<endl;
char* p=(char*)&t;
cout<<*(p+8)<<endl;
}
sizeof 那里考的就是內(nèi)存對(duì)齊的問(wèn)題,short int 的變量必須從模2為0的開(kāi)始,int必須從模4為0 的開(kāi)始,char必須從模1為0的開(kāi)始,而整個(gè)Test依照它的成員中最大的,這里就是int,也就是Test的必須從模4為0的開(kāi)始,而且它必須占4的倍數(shù)。
為了滿足int的條件,short int后要填充(padding)兩個(gè)字節(jié),為了滿足Test的條件,char[5]后必須填充3個(gè)字節(jié),所以總共是2+2+4+5+3=16個(gè)字節(jié)
具體的內(nèi)存對(duì)齊可以參考如下
英文:http://www.chinaitpower.com/2005September/2005-09-13/206312.html
中文:http://blog.ednchina.com/jasony/92132/Message.aspx
這樣*(p+8)也就很容易了解了,跳過(guò)前面8個(gè)字節(jié),即short int 的2個(gè),填充的2個(gè),以及int的4個(gè),最后跳到了c[0]
little endian 和 big endian
當(dāng)一個(gè)變量占多個(gè)字節(jié)時(shí),如何排列這些字節(jié)就產(chǎn)生出了little endian和big endian的區(qū)別
little endian: 把低字節(jié)放在內(nèi)存的低位 (The most significant byte is on the right end of a word)
big endian: 把低字節(jié)放在內(nèi)存的高位 (The most significant byte is on the left end of a word)
舉個(gè)例子:
假設(shè)從地址0x00000000開(kāi)始的一個(gè)字中保存有數(shù)據(jù)0x1234abcd,那么在兩種不同的內(nèi)存順序的機(jī)器上從字節(jié)的角度去看的話分別表示為:
1)little endian:在內(nèi)存中的存放順序是0x00000000-0xcd,0x00000001-0xab,0x00000002-0x34,0x00000003-0x12
2)big endian:在內(nèi)存中的存放順序是0x00000000-0x12,0x00000001-0x34,0x00000002-0xab,0x00000003-0xcd
在構(gòu)造函數(shù)中的Test():b(0x1234),a(b)看起來(lái)有問(wèn)題,本來(lái)想這應(yīng)該涉及到little endian和big endian的問(wèn)題,不過(guò)在vs2005里調(diào)試了一下,發(fā)現(xiàn)由于a比b先聲明,所以實(shí)際上時(shí)a先初始化,也就是a(b)這個(gè)語(yǔ)句先運(yùn)行,由于這時(shí)候b還沒(méi)初始化,a的值就是一個(gè)隨機(jī)數(shù)(相對(duì)于不同的運(yùn)行來(lái)說(shuō)),接著b再初始化為正確值,但是這時(shí)候已經(jīng)無(wú)法改變a的值了































sizeof 那里考的就是內(nèi)存對(duì)齊的問(wèn)題,short int 的變量必須從模2為0的開(kāi)始,int必須從模4為0 的開(kāi)始,char必須從模1為0的開(kāi)始,而整個(gè)Test依照它的成員中最大的,這里就是int,也就是Test的必須從模4為0的開(kāi)始,而且它必須占4的倍數(shù)。
為了滿足int的條件,short int后要填充(padding)兩個(gè)字節(jié),為了滿足Test的條件,char[5]后必須填充3個(gè)字節(jié),所以總共是2+2+4+5+3=16個(gè)字節(jié)
具體的內(nèi)存對(duì)齊可以參考如下
英文:http://www.chinaitpower.com/2005September/2005-09-13/206312.html
中文:http://blog.ednchina.com/jasony/92132/Message.aspx
這樣*(p+8)也就很容易了解了,跳過(guò)前面8個(gè)字節(jié),即short int 的2個(gè),填充的2個(gè),以及int的4個(gè),最后跳到了c[0]
little endian 和 big endian
當(dāng)一個(gè)變量占多個(gè)字節(jié)時(shí),如何排列這些字節(jié)就產(chǎn)生出了little endian和big endian的區(qū)別
little endian: 把低字節(jié)放在內(nèi)存的低位 (The most significant byte is on the right end of a word)
big endian: 把低字節(jié)放在內(nèi)存的高位 (The most significant byte is on the left end of a word)
舉個(gè)例子:
假設(shè)從地址0x00000000開(kāi)始的一個(gè)字中保存有數(shù)據(jù)0x1234abcd,那么在兩種不同的內(nèi)存順序的機(jī)器上從字節(jié)的角度去看的話分別表示為:
1)little endian:在內(nèi)存中的存放順序是0x00000000-0xcd,0x00000001-0xab,0x00000002-0x34,0x00000003-0x12
2)big endian:在內(nèi)存中的存放順序是0x00000000-0x12,0x00000001-0x34,0x00000002-0xab,0x00000003-0xcd
在構(gòu)造函數(shù)中的Test():b(0x1234),a(b)看起來(lái)有問(wèn)題,本來(lái)想這應(yīng)該涉及到little endian和big endian的問(wèn)題,不過(guò)在vs2005里調(diào)試了一下,發(fā)現(xiàn)由于a比b先聲明,所以實(shí)際上時(shí)a先初始化,也就是a(b)這個(gè)語(yǔ)句先運(yùn)行,由于這時(shí)候b還沒(méi)初始化,a的值就是一個(gè)隨機(jī)數(shù)(相對(duì)于不同的運(yùn)行來(lái)說(shuō)),接著b再初始化為正確值,但是這時(shí)候已經(jīng)無(wú)法改變a的值了
posted on 2008-10-27 17:17 apacs 閱讀(587) 評(píng)論(0) 編輯 收藏 引用 所屬分類: c++