Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8621338
  • 博文数量: 1413
  • 博客积分: 11128
  • 博客等级: 上将
  • 技术积分: 14685
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-13 10:03
个人简介

follow my heart...

文章分类

全部博文(1413)

文章存档

2013年(1)

2012年(5)

2011年(45)

2010年(176)

2009年(148)

2008年(190)

2007年(293)

2006年(555)

分类: C/C++

2009-02-19 14:50:09

在c/c++中,结构体的数据存储对齐是常见的一个问题。先看一下这个程序:

#include <iostream>
#pragma pack(8)
using namespace std;

int main()
{
    struct A
    {
        char a;
        int b;
        short c;
    };
    cout << sizeof(A) << endl;
    cout << sizeof(char) << endl;
    cout << sizeof(int) << endl;
    cout << sizeof(short) << endl;
    cout << sizeof(float) << endl;
    cout << sizeof(long) << endl;
    cout << sizeof(double) << endl;
    return 0;
}

从注意问题来看,应该有两个:
1)#pragma pack(8)
2)结构体的大小
对于第一个问题,基本的解答是:
· 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
#pragma pack规定的对齐长度,实际使用的规则是:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和结构体的自然对齐长度中比较小的那个进行。
也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
结构体的对齐,按照结构体中size最大的数据成员和#pragma pack指定值之间,较小的那个进行。
对于第二个问题,一般来讲,结构体中是按最大的成员对齐,里面char长度为1,int为4,short为2,则结果为4*3 = 12.
不过存在两个问题需要注意:
1).在vc和gcc中,因为兼容性问题,可能获取的结果是不一致的。
2).在gcc中:
    struct A
    {
        char a;
        int b;
        double c;
    };
中sizeof(A)的长度为16,因为double为8,如果算下来只能是第一个变量占4,第二个变量占4,第三个变量占8,但是还需要进一步考据。
阅读(747) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~