C++中#pragma pack(N)的用法
来源:互联网 发布:阿里云怎么赚钱 编辑:程序博客网 时间:2024/06/08 00:42
在32位机器上,下列代码中
#pragma pack(2)class A{ int i; union U { char buff[13]; int i; }u; void foo() { } typedef char* (*f)(void*); enum{ red, green, blue } color;}a;
sizeof(a)的值是()
A、20 B、21 C、22 D、24 E、非以上选项
答案:C,void foo() { } ,typedef char* (f)(void);不占字节,枚举占4个字节,union按最大的变量所占字节算,占14个字节,int占4个字节,4+14+4=22。如果改为 #pragma pack(4), 结果就为 24。
下面来看下具体用法:
pragma pack规定的对齐长度,实际使用的规则是:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。
#pragma pack(4)class TestB{public: int aa; //第一个成员,放在[0,3]偏移的位置, char a; //第二个成员,自身长为1,#pragma pack(4),取小值,也就是1,所以这个成员按一字节对齐,放在偏移[4]的位置。 short b; //第三个成员,自身长2,#pragma pack(4),取2,按2字节对齐,所以放在偏移[6,7]的位置。 char c; //第四个,自身长为1,放在[8]的位置。};
这个类实际占据的内存空间是9字节
类之间的对齐,是按照类内部最大的成员的长度,和#pragma pack规定的值之中较小的一个对齐的。
所以这个例子中,类之间对齐的长度是min(sizeof(int),4),也就是4。
9按照4字节圆整的结果是12,所以sizeof(TestB)是12。
如果
#pragma pack(2) class TestB { public: int aa; //第一个成员,放在[0,3]偏移的位置, char a; //第二个成员,自身长为1,#pragma pack(2),取小值,也就是1,所以这个成员按一字节对齐,放在偏移[4]的位置。 short b; //第三个成员,自身长2,#pragma pack(2),取2,按2字节对齐,所以放在偏移[6,7]的位置。 char c; //第四个,自身长为1,放在[8]的位置。 };//可以看出,上面的位置完全没有变化,只是类之间改为按2字节对齐,9按2圆整的结果是10。//所以 sizeof(TestB)是10。
最后看原贴:
现在去掉第一个成员变量为如下代码:
#pragma pack(4) class TestC { public: char a;//第一个成员,放在[0]偏移的位置, short b;//第二个成员,自身长2,#pragma pack(4),取2,按2字节对齐,所以放在偏移[2,3]的位置。 char c;//第三个,自身长为1,放在[4]的位置。 };//整个类的大小是5字节,按照min(sizeof(short),4)字节对齐,也就是2字节对齐,结果是6//所以sizeof(TestC)是6。
整个类的大小是5字节,按照min(sizeof(short),4)字节对齐,也就是2字节对齐,结果是6,所以sizeof(TestC)是6。
1 0
- C++中#pragma pack(N)的用法
- #pragma pack(n)的用法
- #pragma pack(n)的用法
- #pragma pack(n)的用法
- #pragma pack(n) 用法
- #pragma pack 的用法
- pragma pack的用法
- #pragma pack(n) 的作用
- #pragma pack(n) 的作用
- #pragma pack(n)转的
- #pragma pack(n) 的作用
- #pragma pack(n) 的作用
- #pragma pack(n) 的作用
- #pragma pack(n)的作用
- #pragma pack(n) 的作用
- #pragma pack(n)的作用
- C语言的字节对齐 #pragma pack(n)2
- #pragma pack(n) ........ #pragma pack()
- servlet过滤器
- Android下的数据保存、文件读写以及访问模式
- ViewPager高度自适应?height=wrap_content 无效、固定高度适配性差
- CSP的今世与未来
- 关于MAVEN 问题
- C++中#pragma pack(N)的用法
- OpenOrCreateDatabase与SQLiteOpenHelper区别
- javaScript JSON
- 安卓Handler详解
- jsp获得BASEURL
- android的消息处理机制——Looper,Handler,Message
- redis学习 第三章 5种数据类型----sorted set类型
- c++系列文章序
- 2016区域赛前补题训练