struct和class的空間大小計算

2021-08-20 20:19:20 字數 1228 閱讀 7942

structclass的空間大小計算

總體上遵循兩個原則:

(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預...