對struct數據對齊與#pragma pack(n)的理解一直存在誤區,這裡做一個總結,便於以後記憶。
規則主要有兩條:
1.結構,聯合或者類的數據成員,第一個放在偏移為0的地方,以後每一個數據成員的對齊,按照#pragma pack指定的數值和這個數據成員的自身長度來定,取較小的那個。
2.對於整體結構的對齊,則按照結構體中最大數據成員和#pragma pack的大小來定,去較小的那個。
以下是測試代碼:
Cpp代碼
#include<iostream>
using namespace std;
struct test
{
short a;
short b;
int c;
char d;
};
#pragma pack(4)
struct test2
{
char a;
short b;
char c;
};
#pragma pack()
struct s1
{
short a;
long b;
};
struct s2
{
char c;
s1 d;
long long e;
};
#pragma pack(4)
struct s3
{
int a;
char b;
short c;
char d;
};
struct s4
{
char a;
short b;
char c;
};
#pragma pack()
#pragma pack(2)
struct s5
{
int a;
char b;
short c;
char d;
};
#pragma pack()
int main()
{
cout<<sizeof(test)<<endl;
cout<<sizeof(test2)<<endl;
cout<<sizeof(s1)<<endl;
cout<<sizeof(s2)<<endl;
cout<<sizeof(s3)<<endl;
cout<<sizeof(s4)<<endl;
cout<<sizeof(s5)<<endl;
unsigned int ccc;
cout<<sizeof(ccc)<<endl;
}
作者“plussai”