编译器与字节对齐

本文探讨了GCC和VC6.0编译器下结构体成员的字节对齐问题,并通过示例说明如何通过预编译指令和属性调整对齐方式以优化内存使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明出处: http://blog.youkuaiyun.com/zhangyang0402/archive/2010/08/11/5802876.aspx

 

编译器版本
gcc 4.1.2
VC  6.0

 

上次研究了结构体和字节对齐的问题,不过有个复合结构体有点奇怪。
#pragma pack(8)
struct S1
{
        short a;  // 2 byte
        long b;   // 4 byte
};

struct S2
{
        char c;           //1 byte
        struct S1 d;      //8 byte
        long long int e;  //8 byte, VC 6.0下可用double型代替此类型
};
#pragma pack()

 

在gcc下, sizeof(struct S2) = 20, 但在VC 6.0下却是24!

其实,这个牵扯到了编译器自身的默认对齐大小。gcc默认是按4字节对齐的,VC 6.0默认是按8字节对齐。但我们可以在程序中加入预编译指令改变默认对齐大小。

 

#pragma pack(n)
...
#pragma pack()

 

经过测试, 在gcc和VC 6.0中,当分别指定n值为1,2,4时,struct S2的大小相同,分别为15, 16, 20。n=1时, 空间最省,但存取效率低了。但n=8时,gcc 计算的结果为20, VC 6.0计算的结果为24. 貌似使用#pragma pack(8)对gcc不起作用,还是按默认的4字节对齐。在gcc官方网站上

(http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Structure_002dPacking-Pragmas.html#Structure_002dPacking-Pragmas), 可看到gcc是为了与Win32保持兼容性才引入pragma预编译指令的。不过,如果非要指定gcc按8字节对齐也是有办法的,可以使用__attribute__ ((aligned(8)))

struct S1
{
        short a;
        long b;
};

struct S2
{
        char c;
        struct S1 d;
        long long int e;
} __attribute__ ((aligned(8)));

 

这样,再计算sizeof(struct S2)时,就是24了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值