1、位元組對齊(記憶體相關)
現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何地址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體地址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊, 各個硬體平臺對存盤空間的處理上有很大的不同,一些平臺對某些特定型別的資料只能從某些特定地址開始存取,其他平臺可能沒有這種情況,但是最常見的是如果不按照適合其平臺要求對資料存放進行對齊,會在存取效率上帶來損失,比如有些平臺每次讀都是從偶地址開始,如果一個int型(假設為32位系統)如果存放在偶地址開始的地方,那么一個讀周期就可以讀出,而如果存放在奇地址開始的地方,就可能會需要2個讀周期,并對兩次讀出的結果的高低位元組進行拼湊才能得到該int資料,顯然在讀取效率上下降很多,這也是空間和時間的博弈,2、#pragma pack(x)-結構體對齊規則
位元組對齊:(在 .h 頭檔案中為#pragma pack(x)) (x = 1 2 4 ...) 結構體中各個成員按照它們被宣告的順序在記憶體中順序存盤, 1)將結構體內所有資料成員的長度值相加,記為sum_a;2)將各資料成員記憶體對齊,按各自對齊模數而填充的位元組數累加到和sum_a上,記為sum_b,對齊模數是【該資料成員所占記憶體】與【#pragma pack指定的數值】中的較小者, 3)將和sum_b向結構體模數對齊,該模數是【#pragma pack指定的數值】、【未指定#pragma pack時,系統默認的對齊模數8位元組】和【結構體內部最大的基本資料型別成員】長度中數值較小者,結構體的長度應該是該模數的整數倍, 以32bit編譯器為例:
1 #pragma pack(4) 2 struct Test1 3 { 4 char c; 5 short sh; 6 int a; 7 float f; 8 int *p; 9 char *s; 10 double d; 11 };
總共占28Bytes, c的偏移量為0,占1個Byte,sh占2個Byte,它的對齊模數是2(2<4,取小者),存放起始地址應該是2的整數倍,因此c后填充1個空字符,sh的起始地址是2,a占4個Byte,對齊模數是4,因此接在sh后存放即可,偏移量為4,f占4個位元組,對齊模數是4,存放地址是4的整數倍,起始地址是8,p,s的起始地址分別是12,16,d占8個位元組,對齊模數是4(4<8),d從偏移地址為20處存放,存放后結構體占28個位元組,是4的整數倍不用補空字符,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/259920.html
標籤:其他
上一篇:Vert.x初體驗
下一篇:【C++四種cast轉換的學習】 const_cast,static_cast, dynamic_cast, reinterpret_cast
