【发布时间】:2012-04-26 10:19:33
【问题描述】:
我正在通过编译器负责对齐,如以下链接中所述。
http://vcfaq.mvps.org/lang/11.htm
我将我的问题概括为我们必须以编程方式对齐的场景以及编译器将为我们做的那些场景?
如果两台机器具有不同的字节序类型,即一台 m/c 为大字节序,另一台为小字节序并且通过 TCP/IP 协议进行通信,是否需要填充?
请澄清我的问题。
谢谢!
【问题讨论】:
标签: c endianness
我正在通过编译器负责对齐,如以下链接中所述。
http://vcfaq.mvps.org/lang/11.htm
我将我的问题概括为我们必须以编程方式对齐的场景以及编译器将为我们做的那些场景?
如果两台机器具有不同的字节序类型,即一台 m/c 为大字节序,另一台为小字节序并且通过 TCP/IP 协议进行通信,是否需要填充?
请澄清我的问题。
谢谢!
【问题讨论】:
标签: c endianness
当您通过write()(或任何您的函数)发送原始结构时,您只需要担心填充和对齐。检查您的编译器文档,了解如何强制编译器关闭填充,并在 1 字节边界上对齐,如果发送结构是您真正想要做的。不过,只能在网络层执行此操作,因为您正在有效地关闭您正在编译的架构的数据优化。如果您在特定于应用程序的算法(大量读取和写入)中使用结构,如果您摆弄对齐和填充设置,您将失去性能。
此外,您还必须确保结构的所有字段都采用双方都同意的字节序。填充和对齐不会影响字节序。
【讨论】:
TCP/IP 将网络字节顺序定义为 Big-Endian。具有 Little-Endian 架构的计算机必须在传输数据和接收数据之前将 TCP/IP 标头信息中的字节重新排序为 Big-Endian 格式。
TCP/IP 套件中的所有协议层都被定义为大端。
填充/对齐不受字节序的影响。
【讨论】: