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