1. 程式人生 > > VC++平臺上的記憶體對齊操作

VC++平臺上的記憶體對齊操作

我們知道當記憶體的邊界正好對齊在相應機器字長邊界上時,CPU的執行效率最高,為了保證效率,在VC++平臺上記憶體對齊都是預設開啟的,在32位機器上記憶體對齊的邊界為4位元組;比如看如下的程式碼:

struct MyStruct
{
    int i;
    char c;
};
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<sizeof(MyStruct)<<endl;
    return 0;
}

此時輸出的結果並不是sizeof(int) + sizeof(char) = 5而是8,因為記憶體對齊的原因,將char分配為4個位元組效率更高;

在VC平臺上我們可以通過預處理指令:#pragma pack(show)來檢視當前記憶體對齊的方式,我們在程式碼前加上一句#pragma pack(show),再次編譯,在編譯器的“生成”視窗中看到一個警告:“warning C4810: 雜注 pack(show) 的值 == 8”說明這時編譯器採用的是8位元組的對齊方式,另外可以通過這個預處理指令更改對齊方式,比如將程式碼改寫一下:

#pragma pack(show)
#pragma pack(1)

struct MyStruct
{
    int i;
    char c;
};
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<sizeof(MyStruct)<<endl;
    system("PAUSE");
    return 0;
}

這個時候得到結果為5,也就是說我們已經將對齊方式改為了1;
除了這個預處理指令我們也可以通過VC++擴充套件關鍵字align來改變記憶體的對齊方式:

#pragma pack(show)
#pragma pack(1)

struct MyStruct
{
    int i;
    char c;
};

struct __declspec(align(1)) MyStruct1
{
    int i;
    char c;
};

int _tmain(int argc, _TCHAR* argv[])
{
    cout<<sizeof(MyStruct)<<endl;
    cout<<sizeof(MyStruct1)<<endl;
    system("PAUSE");
    return 0;
}

這個時候輸出的結果為兩個5;

.