C Tips: __attribute__((packed))

__attribute__((packed))是GCC的一个扩展,用于指定结构体成员间不进行字节对齐,这可能导致程序在某些系统上运行不稳定。使用时需谨慎。

今天读某位大牛写的C源代码时,看到他在定义结构体时加了这样一个限定:__attribute__((packed))

代码片段如下:

struct cpuid {
	uint32_t eax;
	uint32_t ebx;
	uint32_t ecx;
	uint32_t edx;
} __attribute__((packed));
typedef struct cpuid cpuid_t;

这个“__attribute__((packed))”是什么意思呢?我查了查,具体查了哪些链接,请参考“参考链接”。我简单总结如下:


__attribute__((packed)) 是gcc的一个扩展,它等同于 #pragma pack(1)


它告诉gcc,当编译这个结构体时,如果发生字节不对齐的情况时,不进行任何填充。

也就是说,用它修饰的结构体定义,将不进行字节对齐操作。


这样做当然是很不安全的。正如 stackoverflow.com 上面有人说,在某些系统,例如SPARC上,这样做会导致程序崩溃。

如果你要使用  __attribute__((packed)) 这个扩展,你必须十分有把握,十分清楚自己在做什么,并对由此可能给程序带来的不安全因素负起责任来。


有人专门写了篇文章:《Why you shouldn’t use __attribute__((packed))》http://digitalvampire.org/blog/index.php/2006/07/31/why-you-shouldnt-use-__attribute__packed/


牢记:如果没有充分的理由和十足的把握,请不要用它。


参考链接:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值