【发布时间】:2010-12-17 22:15:44
【问题描述】:
目的
我正在用 C 语言编写一个网络程序(特别是 gnu89),我想通过将某个 struct X 重新解释为大字节数组(又名 char)来简化事情,通过网络发送字节,并在另一边将它们重新解释为struct X。为此我决定使用 gcc 的 __attribute__((__packed__ ))。我已尽最大努力确保正确完成此操作(即我已经考虑了字节顺序和其他相关问题)。
问题
除了保证struct X 尽可能小,gcc 是否保证用 __attribute__((__packed__ )) 定义的struct 保留原始顺序?我进行了大量搜索,但尚未找到任何有关此保证是否存在的文档。
备注
可以安全地假设发送者和接收者都不会遇到可移植性问题(例如,服务器上的 sizeof(int) 等于客户端上的 sizeof(int))。
【问题讨论】:
-
“原始订单”是什么意思?您的意思是结构成员的字面顺序与定义中指定的顺序相同吗?
-
鉴于您正在编写网络程序,当您的数据进入使用 SPARC 或 PowerPC 芯片(仅举两个系列)的机器时,您可能会陷入痛苦的境地,而来源是英特尔芯片。此外,如果您使用打包结构加载和发送数据之外的任何其他操作,访问打包数据所带来的性能损失可能比您编写代码以平台中立的方式从解压缩数据结构中序列化数据要差得多。此外,精心设计的数据结构中不会有随机漏洞——这是可以做到的。
-
+1 乔纳森的上述评论。重新设计您的结构,使其在第一行中没有孔。 (从最大到最小的元素通常就足够了。)
-
@Jonathan Leffler 我写这个程序仅供个人使用。我事先知道连接机器的架构。
标签: c gcc compiler-construction networking struct