Chinaunix

标题: __attribute__((packed))一般在什么时候才会用到哦? [打印本页]

作者: jssfy    时间: 2010-07-16 08:52
标题: __attribute__((packed))一般在什么时候才会用到哦?
有人说,网络数据交换,一般都需要__attribute__((packed)),有什么具体一些的例子否?
作者: yikaikai    时间: 2010-07-16 09:01
为了字节对齐
作者: jssfy    时间: 2010-07-16 09:05
为了字节对齐
yikaikai 发表于 2010-07-16 09:01



    这个我了解了,不过不明白空间哪些具体的场合会用到这种用法
作者: klanet    时间: 2010-07-16 09:22
协议包,如下
103 struct usb_ctrlrequest {
104       __u8 bRequestType;
105       __u8 bRequest;
106       __le16 wValue;
107       __le16 wIndex;
108      __le16 wLength;
109 } __attribute__ ((packed));

作者: jssfy    时间: 2010-07-16 10:02
协议包,如下
klanet 发表于 2010-07-16 09:22



    谢谢,虽然没有找到你所提到的代码,但是内核中确实有看到挺多的应用的,
    但是不太明白内核中这样做的原因是为了节省空间呢还是什么原因
作者: prolj    时间: 2010-07-16 10:14
GNU扩展,对齐用的。
作者: beyond_touch    时间: 2010-07-16 10:14
想想struct是如何对齐的

不同框架的处理器对齐方式会有不同,这个时候不指定对齐的话,会产生错误结果
作者: ka-bar    时间: 2010-07-16 10:41
跨平台通信时用到。不同平台内存对齐方式不同。
如果使用结构体进行平台间的通信,会有问题。
例如,发送消息的平台上,结构体为24字节,接受消息的平台上,此结构体为32字节(只是随便举个例子),那么每个变量对应的值就不对了。
我曾经写过一个帖子,水平有限,但还算是详细:
http://bbs.kylin-linux.com/htm_data/10/1005/339.html
作者: jssfy    时间: 2010-07-16 11:01
跨平台通信时用到。不同平台内存对齐方式不同。
如果使用结构体进行平台间的通信,会有问题。
例如,发送 ...
ka-bar 发表于 2010-07-16 10:41



    太有道理了,谢谢了
作者: klanet    时间: 2010-07-16 13:30
谢谢,虽然没有找到你所提到的代码,但是内核中确实有看到挺多的应用的,
    但是不太明白内核 ...
jssfy 发表于 2010-07-16 10:02


代码是usb驱动的源代码,include/linux/usb_ch9.h中。代码版本是2.6.10。
原因8L解释的很清楚。其实如果做过网络协议的人会对对齐,大小端理解的更深刻。
作者: wmmy2008    时间: 2010-07-16 15:15
字节对齐和大小端没啥关系吧
作者: t3gonline    时间: 2010-07-16 15:34
不懂,mark以下
作者: 没本    时间: 2010-07-16 15:36
如果想兼容MSVC,可以用GCC的兼容扩展
#pragma pack(push,1)
......
#pragma pack(pop)
楼主的__attribute__((packed))是GCC扩展。
作者: fly6    时间: 2012-06-13 15:54
感觉为了平台的兼容性还不如
#pragma pack(push)
#pragma pack(1)
struct
{
...................
}
#pragma pack(pop)
作者: yulihua49    时间: 2012-06-13 16:16
本帖最后由 yulihua49 于 2012-06-13 16:18 编辑
jssfy 发表于 2010-07-16 08:52
有人说,网络数据交换,一般都需要__attribute__((packed)),有什么具体一些的例子否?

如果在非X86的机器间传送是非常危险的,可导致程序崩溃。
最好是对结构序列化,变成XML或JSON什么的。
见:
http://bbs.chinaunix.net/thread-3752484-1-1.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2