Chinaunix首页 | 论坛 | 博客
  • 博客访问: 162544
  • 博文数量: 26
  • 博客积分: 1225
  • 博客等级: 中尉
  • 技术积分: 395
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-06 21:11
文章分类

全部博文(26)

文章存档

2018年(2)

2014年(1)

2011年(3)

2010年(2)

2009年(1)

2008年(17)

我的朋友

分类: C/C++

2009-12-01 13:07:26


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指定的压缩方式。
阅读(2207) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~