struct table_entry
{
int count ;
unsigned int f1 :4;
char c;
unsigned int f2 :1;
char d;
};
|
在gcc和vc下其大小分别为:8、20.
分析:
1、gcc默认会对位域及其附近成员进行压缩,而且gcc不考虑位域的类型,对于char和int型位域,gcc会压缩在一个int型长度内,例如:
struct struct_test
{
int a: 10;
char b: 4;
};
(按照默认四字节对齐) |
sizeof(strcut test) === 4;
2、而vc则会区分位域的类型char和int型位域成员,必须在各自内存内存放,因此上例在vc下执行的结果为8.
********************************************************************************************************
一下关于pack的用法源于msdn,理解不正确的地方请大家指出讨论讨论~:
1、pack(n):不指定n时,使用默认字节压缩格式,其值由/Zp指定;指定n时按照n字节对齐。
此时一般用puck(1),pack()组合使用进行压缩和恢复:
#pragma pack(1)
struct S {
int i; // size 4
short j; // size 2
double k; // size 8
};
#pragma pack()
struct T {
int i;
short j;
double k;
};
|
2、使用push、pop组合:
a)
pack(push, 1)和pack(pop)成对使用;
b)
pack(push, mystatck, 1)和pack(pop, mystatck)成对使用;
注
意:
c) pack(pop,
4)的效果等于pack(4),且pack(pop, mystack, 1)是无效的。
d)
pack(pop, mystack, 1)如果找到曾经定义过的pack(push, mystack,
n),则删除它及它前面的定义,将它下一个作为堆栈的顶部(作为当前压缩方式);若没有找到,则什么都不做。
e)
pach(push, mystack, n):不指定mystack和n时,将默认格式,即/Zp指定的压缩方式。
阅读(2264) | 评论(0) | 转发(0) |