【編譯製導指令】#pragma pack - 位元組數基準對齊

Koma_Wong發表於2018-06-13

#pragma pack(1)

struct {
    char c;
    int i;
}S;
int main()
{
    cout<<sizeof(S)<<endl;
}

那麼,結果為:

$ g++ main.cpp
$ ./a.exe
8

如果

#pragma pack(1)
struct {
    char c;
    int i;
}S;

這樣的結果為5

#pragma pack(2)

如果是這樣

#pragma pack(2)
struct {
    char c;
    int i;
}S;

那麼輸出結果為6

#pragma pack(3)

錯誤資訊

$ g++ main.cpp
main.cpp:5:16: 警告:對齊邊界必須是 2 的較小次方,而不是 3 [-Wpragmas]
 #pragma pack(64)
                ^

#pragma pack(push,1)#pragma pack(1)的區別

#pragma pack (n)C編譯器將按照n個位元組對齊。 #pragma pack ()取消自定義位元組對齊方式。 #pragma pack (push,1)把原來對齊方式設定壓棧,並設新的1個位元組對齊 #pragma pack(pop)恢復對齊狀態

例如:

#pragma pack(push) //儲存當前對齊狀態
#pragma pack(4)    //設定為4位元組對齊 

相當於

#pragma  pack (push,4)

例子

#include <iostream>

using namespace std;

#pragma pack(1)
struct {
    char c;
    int i;
    double d;
}S1;
#pragma pack() //與上面#pragma pack(4)對應

#pragma pack(4)
struct {
    char c;
    int i;
    double d;
}S2;
#pragma pack()

#pragma pack(push,4)
struct {
    char c;
    int i;
    double d;
}S3;
#pragma pack(pop)


int main()
{
    cout<<sizeof(S1)<<endl;
    cout<<sizeof(S2)<<endl;
    cout<<sizeof(S3)<<endl;
}

結果為:

$ g++ main.cpp
$ ./a.exe
13
16
16

相關文章