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