位元組對齊方式給繼承帶來的記憶體浪費

2021-04-18 16:47:03 字數 620 閱讀 3153

位元組對方方式大家一定不陌生了,考慮下面的結構(類也一樣): typedef struct tagactualpoint actualpoint;

那麼sizeof(actualpoint)等於多少呢?答案是16,而非12,其中的原因就是vc++預設按 8位元組對齊,大於12的,8的整數倍的資料最小就是16了。

假設還有下面乙個結構: typedef struct tagmaindata maindata;

那麼sizeof(maindata)等於多少呢?不難算出,也是16個位元組,好了,大家是不是覺得 maindata應該從繼承actualpoint呢,至少這樣**看起來更好看: typedef struct tagmaindata : public actualpoint maindata;

現在的sizeof(maindata)等於多少,細心一點不難發現,達到了24!浪費夠嚴重的吧?(還有更嚴重的:把float value改為byte value,則sizeof(maindata) 仍然等於24,而真正有用的資料才10位元組,浪費了12位元組!)原因很簡單,父結構不會與子結構來分擔填充空間(對齊的時候,經常需要填充),所以以後大家有類似上面的用法的時候,可要注意了,雖然現在記憶體便宜,但也還是能省則省!

上面我的例子,**於我的乙個實際的軟體。

C 記憶體的位元組對齊

在訪問記憶體時,如果位址是按4位元組對齊,則訪問效率會高很多。這種現象的原因在於訪問記憶體的硬體電路。一般情況下,位址匯流排總是按照對齊後的位址來訪問。例如,你想得到0x00000001開始的四位元組內容,系統首先需要以0x00000000讀四位元組,從中取得3位元組,然後再用0x00000004作...

記憶體中的位元組對齊

一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作...

c c 的記憶體位元組對齊

先了解下c c 基本型別的位元組占用情況,pragma pack 規定的對齊長度,實際使用的規則是 也就是說,當 pragma pack的值等於或超過所有資料成員長度的時候,這個值的大小將不產生任何效果。再來看個例子 include using namespace std define offset...