struct和class的空間大小計算
總體上遵循兩個原則:
(1)
整體空間是占用空間最大的成員所佔位元組的整數倍;但在
linux+gcc
環境下,若最大的成員型別所佔位元組超過4,如
double是8
,則整體空間是
4的倍數即可。
(2)
資料對齊原則
——記憶體按結構體成員的先後順序排列,當排到該成員變數時,其前面已擺好的空間大小必須是成員型別大小的整數倍,如果不夠就對齊,依次向後類推。
特殊情況:
(1)
含靜態變數的類:
static
靜態成員為所有物件共享,存放在靜態儲存區(
data
段),並不存放在類的物件中,所以對類的大小無影響。
(
sizeof是用來計算
棧大小,不涉及全域性區,故類的靜態成員大小sizeof不涉及
)
(2)
含陣列的類:陣列是按照單個變數乙個乙個進行擺放,而不是視為整體,但整體空間仍是單個占有空間最大的成員所佔位元組的整數倍。
(3)強制位元組對齊
①windows
環境下:
使用偽指令#pragma pack(n),編譯器將按n位元組對齊;
使用偽指令#pragma pack(),取消自定義位元組對齊方式。
②linux+gcc
環境下:
使用偽指令_attribute_(aligned(n)),編譯器將按n位元組對齊;
使用偽指令_attribute_((packed)),取消自定義位元組對齊方式。
union
的空間大小計算
結構體在記憶體上組織上是順序式的,聯合體則是重疊式,各成員共享一段記憶體,所以sizeof(
聯合體union)
結果是每個成員
sizeof
的最大值。當然,整體空間仍是單個占有空間最大的成員所佔位元組的整數倍(包含陣列時)。
struct和class的關係
一 預設繼承許可權。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理 二 成員的預設訪問許可權。class的成員預設是private許可權,struct預設是public許可權。除了這兩點,class和struct基本就是乙個東西。語法上...
struct和class的區別
1.值型別與引用型別 結構是值型別 值型別在堆疊上分配位址,所有的基型別都是結構型別,例如 int 對應system.int32 結構,string 對應 system.string 結構 通過使用結構可以建立更多的值型別 類是引用型別 引用型別在堆上分配位址 堆疊的執行效率要比堆的執行效率高,可是...
class和struct的區別
從語法上,在c 中 只討論c 中 class和struct做型別定義時只有兩點區別 一 預設繼承許可權。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理 二 成員的預設訪問許可權。class的成員預設是private許可權,struct預...