#pragma pack 的用法

#pragma pack([n]) 表示内存对齐,目的是为了优化内存,减少内存碎片,使得内存按照一个固定的规则进行分配,让分配的内存总是n 的倍数。

其中,n  = 1,2,4,8,16,32……

(1)Visual C++ 起始地址对齐的倍数规则

在默认情况下,Visual C++规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须是该变量的类型所占用的字节数的倍数。e.g.

 

#include <iostream>

int main(){
	class X{
	public:
		int a;
		char b;
		short c;
	};
	int t = sizeof(X);
	return 0;
}


t 正常应为7(=4+1+2),但实际却是为8。为什么?

a   b c 
01234567

(2)#pragma pack 规定的对齐长度规则

规则如下:结构、联合或者类的数据成员第一个放在偏移为0的位置,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员类型长度中取比较小的那个值对齐存放。

(3)#pragma pack的圆整规则

规则如下:在声明#pragma pack(n)的情况下,整个数据类型的长度必须是n的倍数。

 

#include <iostream>

int main(){
#pragma pack(4)
	class X{
	public:
		int a;
		char b;
		short c;
		char d;
	};
	int t1 = sizeof(X);
	return 0;
}


 

t1 = 12;//正常应为8,对齐后为9,圆整规则后为12.

 

PS:

#pragma pack(push,n)表示规则开始有效

#pragma pack(pop)表示规则结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值