我正在閱讀Game Coding Complete第4版。有一個關於內存對齊的主題。在下面的代碼中,作者說第一個結構非常慢,因爲它不是位對齊的,也不是字節對齊的。第二個不是位對齊,而是字節對齊。最後一個在快速,因爲它是兩個。他說,如果沒有編譯指示,編譯器會調整內存本身,導致內存浪費。我無法真正理解計算。C/C++中的內存對齊
這是從文本某些部分: -
如果編譯器被留下通過加入未使用的字節以優化SlowStruct, 每個結構將是24個字節,而不是僅僅14.七個額外字節 後填充第一個字符變量,剩餘的字節添加在結尾。這確保了 整個結構始終以8字節的邊界開始。這大約是浪費空間的40%,這全部歸因於成員變量的粗心排序。
這是以粗體顯示的結束行: - 不要讓編譯器浪費寶貴的內存空間。把你的一些腦細胞放到 的工作中,並調整你自己的成員變量。
請給我演示計算並更清楚地解釋文本中的填充概念。
代碼: -
#pragma pack(push, 1)
struct ReallySlowStruct
{
char c : 6;
__int64 d : 64;
int b : 32;
char a : 8;
};
struct SlowStruct
{
char c;
__int64 d;
int b;
char a;
};
struct FastStruct
{
__int64 d;
__int b;
char a;
char c;
char unused[2];
};
#pragma pack(pop)
_it既不是位對齊也不是字節aligned_。位對齊?我沒有得到這個,C中最小的可尋址地址是一個字節,不是嗎? –
相關/ dupe:http://stackoverflow.com/questions/5397447/struct-padding-in-c和http://stackoverflow.com/questions/6025269/data-structure-padding – NathanOliver
也請參閱這個wiki:https: //en.wikipedia.org/wiki/Data_structure_alignment – NathanOliver