{C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}
?
----------------------------the result are:-------------------------------------sizeof('$')=1sizeof(1)=4sizeof(1.5)=8sizeof("Good!")=6sizeof(i)=4sizeof(c)=1sizeof(x)=4sizeof(p)=8sizeof(x+1.732)=8sizeof(char)=1sizeof(int)=4sizeof(float)=4sizeof(double)=8sizeof(str)=16sizeof(a)=40sizeof(xy)=80sizeof(st)=16sizeof(student1)=16Press any key to continue-------------------------------------------------------------------------//? #pragma pack( )? //? mulbayes? //? unicode-------------------------------------------------------------------------
為了能使CPU對(duì)變量進(jìn)行高效快速的訪問,變量的起始地址應(yīng)該具有某些特性,即所謂的“對(duì)齊”。例如對(duì)于4字節(jié)的int類型變量,其起始地址應(yīng)位于4字節(jié)邊界上,即起始地址能夠被4整除。變量的對(duì)齊規(guī)則如下(32位系統(tǒng)):
TypeAlignment
char在字節(jié)邊界上對(duì)齊
short (16-bit)在雙字節(jié)邊界上對(duì)齊
int and long (32-bit)在4字節(jié)邊界上對(duì)齊
float在4字節(jié)邊界上對(duì)齊
double在8字節(jié)邊界上對(duì)齊
structures單獨(dú)考慮結(jié)構(gòu)體的個(gè)成員,它們?cè)诓煌淖止?jié)邊界上對(duì)齊。其中最大的字節(jié)邊界數(shù)就是該結(jié)構(gòu)的字節(jié)邊界數(shù)。MSDN原話:Largest alignment requirement of any member理解結(jié)構(gòu)體的對(duì)齊方式有點(diǎn)撓頭,如果結(jié)構(gòu)體中有結(jié)構(gòu)體成員,那么這是一個(gè)遞歸的過程。對(duì)齊方式影響結(jié)構(gòu)體成員在結(jié)構(gòu)體中的偏移設(shè)編譯器設(shè)定的最大對(duì)齊字節(jié)邊界數(shù)為n,對(duì)于結(jié)構(gòu)體中的某一成員item,它相對(duì)于結(jié)構(gòu)首地址的實(shí)際字節(jié)對(duì)齊數(shù)目X應(yīng)該滿足以下規(guī)則:
X = min(n, sizeof(item))
例如,對(duì)于結(jié)構(gòu)體 struct {char a; int b} T;
當(dāng)位于32位系統(tǒng),n=8時(shí):a的偏移為0,b的偏移為4,中間填充了3個(gè)字節(jié), b的X為4;
當(dāng)位于32位系統(tǒng),n=2時(shí):a的偏移為0,b的偏移為2,中間填充了1個(gè)字節(jié),b的X為2;
結(jié)構(gòu)體的sizeof設(shè)結(jié)構(gòu)體的最后一個(gè)成員為L(zhǎng)astItem,其相對(duì)于結(jié)構(gòu)體首地址的偏移為offset(LastItem),其大小為sizeof(LastItem),結(jié)構(gòu)體的字節(jié)對(duì)齊數(shù)為N,則:結(jié)構(gòu)體的sizeof 為: 若offset(LastItem)+ sizeof(LastItem)能夠被N整除,那么就是offset(LastItem)+ sizeof(LastItem),否則,在后面填充,直到能夠被N整除。
例如:32位系統(tǒng),n=8,結(jié)構(gòu)體 struct {char a; char b;} T;struct {char a; int b;} T1;struct {char a; int b; char c;} T2;sizeof(T) == 2; N = 1 沒有填充sizeof(T) == 8; N = 4 中間填充了3字節(jié)sizeof(T2)==12; N = 4 中間,結(jié)尾各填充了3字節(jié)
注意:
1) 對(duì)于空結(jié)構(gòu)體,sizeof == 1;因?yàn)楸仨毐WC結(jié)構(gòu)體的每一個(gè)實(shí)例在內(nèi)存中都有獨(dú)一無二的地址。
2) 結(jié)構(gòu)體的靜態(tài)成員不對(duì)結(jié)構(gòu)體的大小產(chǎn)生影響,因?yàn)殪o態(tài)變量的存儲(chǔ)位置與結(jié)構(gòu)體的實(shí)例地址無關(guān)。
例如:
struct {static int I;} T; struct {char a; static int I;} T1;sizeof(T) == 1; sizeof(T1) == 1;
3) 某些編譯器支持?jǐn)U展指令設(shè)置變量或結(jié)構(gòu)的對(duì)齊方式,如VC,? 詳見MSDN(alignment of structures)
并不是要求#pragma pack(8),就一定是每個(gè)成員都是8字節(jié)對(duì)齊而是指一組成員要按照8字節(jié)對(duì)齊。struct s1{?? short a;?? // 2字節(jié)?? long b;??? // 4字節(jié)};整個(gè)s1小于8字節(jié),因此s1就是8字節(jié)。
struct s2{?? char c;??? // 1字節(jié)?? s1 d;????? // 8字節(jié)?? __int64 e; // 8字節(jié)};整個(gè)s2小于12字節(jié),但是由于#pragma pack(8)的限定,12不能與8字節(jié)對(duì)齊,因此s2就是24字節(jié),c占用8字節(jié)---------------------------------類或?qū)ο蟮拈L(zhǎng)度:?? 非虛函數(shù)相當(dāng)與全局,不在類里。?? 靜態(tài)也是全局,不在類里。?? 但是const要分配空間。
非靜態(tài)變量,虛函數(shù)鏈表(如果類中有虛函數(shù)的話) -----------分配空間
posted on 2005-10-24 17:39 夢(mèng)在天涯 閱讀(3703) 評(píng)論(4) 編輯 收藏 引用 所屬分類: CPlusPlus
學(xué)到了很多,謝謝 回復(fù) 更多評(píng)論
補(bǔ)充一個(gè),如果結(jié)構(gòu)和類為空,即沒有任何的成員,他的長(zhǎng)度仍然為1。 Struct a { } sizeof(a) will be 1. 回復(fù) 更多評(píng)論
X = min(n, sizeof(item))例如,對(duì)于結(jié)構(gòu)體 struct {char a; int b} T;中的struct {char a ; char b} T; 應(yīng)該是struct {char a ; char b;} T; 少了個(gè)分號(hào)! 回復(fù) 更多評(píng)論
不錯(cuò),樓主繼續(xù)努力,寫多點(diǎn)好博文 回復(fù) 更多評(píng)論