1

可能重复:
使用 pragma pack(1) 时是否存在性能问题?

在 C 中执行 pragma pack(1) 的缺点是什么?我已经为通信协议定义了一些结构数据,我想关闭任何字节对齐,这样数据就在它应该在的位置,并且我得到了结构的实际大小(11 个字节)。关闭字节对齐有什么缺点?是性能吗?

4

3 回答 3

4

性能会变慢。

如果整数(和其他数据类型)位于“偶数”内存边界上(如果它们可以轻松访问),它们可能会“跨越”内存边界并需要两次提取(CPU 周期)来检索它们。

于 2013-01-20T23:06:25.577 回答
3

有几个“缺点”:

  1. 它不是 C。它是某些 C 编译器中特定于实现的 hack。

  2. 它并不能真正帮助您解决通过网络发送二进制结构或将它们存储到磁盘的问题,因为您仍然需要处理字节顺序问题。

  3. Ifst.fooint压缩结构的成员,&st.foo通常不是有效的int *. 当被调用函数尝试通过指针访问数据时,传递&st.foo给接受类型参数的函数可能会导致崩溃或内存损坏。int *

  4. 是无偿的。正确设计的二进制交换结构已经具有零填充,因为所有字段都在与其大小相对应的边界上对齐。

于 2013-01-21T02:07:23.010 回答
2

是的。由于处理器/内存连接的性质,在对齐的地址访问多字节值要快得多,如果我没记错的话,对齐也会影响缓存。

如果您将使用结构中的数据进行大量计算,我建议您在代码中使用未打包的版本,并在传输时转换为打包版本。另一方面,如果您没有使用结构中的值进行大量计算,那么这种转换将是浪费的。

于 2013-01-20T23:08:36.557 回答