pragma pack,字节对齐

关于字节对齐

pragma pack

一、

测试代码:

// packTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

using namespace std;

/************************************************************************/
/*    Defualt                                                           */
/************************************************************************/
class A0
{
	char a;
	int b;
	double c;
	bool d;
	short e;	
};
class A1
{
	char a;
	int b;
	double c;
	bool d;
};
class A2
{
	char a;
	int b;
	double c;
};
class A3
{
	char a;
	int b;
};
class A
{
	char a;
	int b;
	double c;
	bool d;
	short e;
	char f;
};
/*
事实上,很多人对#pragma pack的理解是错误的。
#pragma pack规定的对齐长度,实际使用的规则是:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,
按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。
*/

/************************************************************************/
/*                                                                      */
/************************************************************************/
#pragma  pack(push)
#pragma  pack(1)
class B
{
	char a;
	int b;
	double c;
	bool d;
	short e;
	char f;
};
#pragma  pack(pop)

/************************************************************************/
/*                                                                      */
/************************************************************************/
#pragma  pack(push)
#pragma  pack(2)
class BB
{
	char a;
	int b;
	double c;
	bool d;
	short e;
	char f;
};
#pragma  pack(pop)


/************************************************************************/
/*                                                                      */
/************************************************************************/
#pragma  pack(push)
#pragma  pack(4)
class C
{
	char a;
	int b;
	double c;
	bool d;
	short e;
	char f;
};
#pragma  pack(pop)


/************************************************************************/
/*                                                                      */
/************************************************************************/
#pragma  pack(push)
#pragma  pack(8)
class D
{
	char a;
	int b;
	double c;
	bool d;
	short e;
	char f;
};
#pragma  pack(pop)

int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"char : "<<sizeof(char)<<" byte \n";
	cout<<"int : "<<sizeof(int)<<" byte \n";
	cout<<"double : "<<sizeof(double)<<" byte \n";
	cout<<"bool : "<<sizeof(bool)<<" byte \n";
	cout<<"short : "<<sizeof(short)<<" byte \n";
	cout<<"/*---------------------------------------------*/"<<"\n";
	cout<<"Default aligned A3:"<<sizeof(A3)<<"\n";
	cout<<"Default aligned A2:"<<sizeof(A2)<<"\n";
	cout<<"Default aligned A1:"<<sizeof(A1)<<"\n";
	cout<<"Default aligned A0:"<<sizeof(A0)<<"\n";
	cout<<"Default aligned A:"<<sizeof(A)<<"\n";
	cout<<"1 aligned:"<<sizeof(B)<<"\n";
	cout<<"2 aligned:"<<sizeof(BB)<<"\n";
	cout<<"4 aligned:"<<sizeof(C)<<"\n";
	cout<<"8 aligned:"<<sizeof(D)<<"\n";
	return 0;
}

二、测试结果


三 、各类说明分析

/************************************************************************/
/*    Defualt                                                           */
/************************************************************************/
class A0
{
	/*
	* 默认为 8 字节对齐
	*/
	char a;
	int b;
	double c;
	bool d;
	short e;
};
class A1
{
	char a;
	int b;
	double c;
	bool d;
};
class A2
{
	char a;
	int b;
	double c;
};
class A3
{
	char a;
	int b;
};
class A
{
	char a;
	int b;
	double c;
	bool d;
	short e;
	char f;
};


/************************************************************************/
/*                                                                      */
/************************************************************************/
#pragma  pack(push)
#pragma  pack(1)
class B
{
	char a;
	int b;
	double c;
	bool d;
	short e;
	char f;
};
#pragma  pack(pop)



/************************************************************************/
/*                                                                      */
/************************************************************************/
#pragma  pack(push)
#pragma  pack(2)
class BB
{
	char a;
	int b;
	double c;
	bool d;
	short e;
	char f;
};
#pragma  pack(pop)



/************************************************************************/
/*                                                                      */
/************************************************************************/
#pragma  pack(push)
#pragma  pack(4)
class C
{
	char a;
	int b;
	double c;
	bool d;
	short e;
	char f;
};
#pragma  pack(pop)




/************************************************************************/
/*                                                                      */
/************************************************************************/
#pragma  pack(push)
#pragma  pack(8)
class D
{
	char a;
	int b;
	double c;
	bool d;
	short e;
	char f;
};
#pragma  pack(pop)



参考:http://msdn.microsoft.com/zh-cn/library/2e70t5y1(v=vs.90).aspx


***************************************************************************

Specifies the value, in bytes, to be used for packing. The default value for n is 8. Valid values are 1, 2, 4, 8, and 16. The alignment of a member will be on a boundary that is either a multiple of n or a multiple of the size of the member, whichever is smaller.




源码下载地址:http://download.csdn.net/detail/cartzhang/6792147 

本博客源码链接地址

----------------------------------

若有 问题,请不吝赐教。

非常感谢!



转载于:https://www.cnblogs.com/qitian1/p/6461988.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值