VC++平臺上的內存對齊操做

若是不想讓struct內存對齊,只須要標記對齊方式爲1便可code

#pragma pack(1)

 

咱們知道當內存的邊界正好對齊在相應機器字長邊界上時,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來改變內存的對齊方式:class

#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;效率

相關文章
相關標籤/搜索