C C 語言記憶體對齊

2021-09-14 07:40:35 字數 1165 閱讀 3177

記憶體對齊:在計算機中,記憶體空間按照位元組劃分,理論上可以從任何起始位址訪問任何型別的變數。但實際上在訪問特定型別的變數的時候需要從特定的位址開始,這就需要各種型別的資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的存放,這就是記憶體對齊,也叫位元組對齊。

記憶體對齊的作用:

預設記憶體對齊影響因素:與平台架構(位數)和編譯器的預設設定有關。

匯流排週期: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劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...