先看一个程序:
#include<iostream>
using namespace std;
#pragma pack(8)
struct example1
{
short a;
long b;
};
struct example2
{
char c;
example1 struct exa1;
short e;
};
#pragma pack()
int main(void)
{
example2 struct exa2;
cout<< sizeof(struct example1)<<endl;
cout<< sizeof(struct example2)<<endl;
system("pause");
return 0;
}
结果为8 16
自然对界:
编译器会自动进行成员变量的对齐。缺省情况下(第一个成员的地址和整体结构的地址相同)。是指按结构体的成员中size最大的成员对齐。
struct naturalaign
{
char a;
short b;
char c;
};
size最大为short的2字节。故char成员a、c都以2位单位对齐,结果为6
若改为:
struct naturalaign
{
char a;
int b;
char c;
};
其结果为12
制定对界:
可以通过伪指令#paogma pack(n)来改变缺省的对界条件。编译器间按照n个字节对齐,使用伪指令#paogma pack( )来取消自定义字节对齐方式
注意:如果#paogma pack(n)中n大于结构体中最大成员的size,则不起作用,任按照size最大成员对界
#paogma pack(n)
struct naturalign
{
char a;
int b;
char c;
};
#paogma pack( )
当n为4,8,16时,对其方式均为一样为12。当n为2时,结果为8
本文探讨了C++中结构体的内存对齐规则,包括自然对齐和指定对齐的方法。通过示例代码解释了如何使用#pragmapack控制对齐,并展示了不同情况下结构体大小的变化。

546

被折叠的 条评论
为什么被折叠?



