读书笔记--struct的成员对齐

本文探讨了C++中结构体的内存对齐规则,包括自然对齐和指定对齐的方法。通过示例代码解释了如何使用#pragmapack控制对齐,并展示了不同情况下结构体大小的变化。

  先看一个程序:
#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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值