記憶體對齊:在計算機中,記憶體空間按照位元組劃分,理論上可以從任何起始位址訪問任何型別的變數。但實際上在訪問特定型別的變數的時候需要從特定的位址開始,這就需要各種型別的資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的存放,這就是記憶體對齊,也叫位元組對齊。
記憶體對齊的作用:
預設記憶體對齊影響因素:與平台架構(位數)和編譯器的預設設定有關。
匯流排週期:cpu通過匯流排和儲存器或者io裝置進行一次資料傳輸需要的時間,通常為四個或者多個時鐘週期組成。整體型別的對齊規則:若設定了記憶體對齊為m個位元組,類中的最大成員的對齊位元組為n,則該資料型別的對齊位元組為p=min(m,n)。(一般32位機器的預設pack為4位;64位機器的預設pack為8位,程式中可以顯式設定pack的大小)
型別中成員的對齊規則:類中的第乙個成員放在offset為0的位置;對於其他成員,若設定了記憶體對齊為m個位元組,假設該資料成員的對齊位元組數(即當前成員所佔的位元組數)為k,則該資料成員的起始位置是min(m,k)的整數倍。
整體對齊規則:最後整個型別的大小為p=min(m,n)的整數倍。
當設定對齊位元組數大於類中最大成員的對齊位元組數的時候,這個設定實際不產生任何效果;當設定對齊位元組數為1時,類的大小就是簡單的把所有成員大小相加。
例項:
#include #include using namespace std;
//前提條件:32位機器,當前編譯器預設pack為4
struct t ;
int main()
根據上面的分析:
修改系統的預設pack可以使用系統函式pragma的pack引數,但是修改之後的pack一定是2的n次冪。
#pragma pack(16) //修改pack修改為16
#pragma pack() //恢復系統的預設pack
#pragma pack(show) //返回系統當前的pack,由警告資訊顯示,注意gcc不支援。只有vs支援
此外pack還有push,pop其他引數可選,但是不同的編譯器對這些引數的實現有不同的含義,如果需要了解可以參考對應的資料。 C C 語言記憶體對齊
一 什麼是對齊,以及為什麼要對齊 1.現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。2.對齊的作...
C C 記憶體對齊
一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...
C C 記憶體對齊
一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...