在C中使用pragma pack(1)有什么缺点?

时间:2013-01-20 23:04:18

标签: c memory-alignment

  

可能重复:
  Are there performance issues when using pragma pack(1)?

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

3 个答案:

答案 0 :(得分:3)

性能会变慢。

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

答案 1 :(得分:3)

有几个“缺点”:

  1. 这不是C.这是某些C编译器中特定于实现的黑客攻击。

  2. 对于通过线路发送二进制结构或将其存储到磁盘的问题,它并没有真正帮助您,因为您仍然需要处理字节顺序问题。

  3. 如果st.foo是打包结构的int成员,则&st.foo通常不是有效的int *。将&st.foo传递给带有int *类型参数的函数可能会在被调用函数尝试通过指针访问数据时导致崩溃或内存损坏。

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

答案 2 :(得分:2)

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

如果您将使用结构中的数据进行大量计算,我建议您在代码中使用解压缩版本,并在传输时转换为打包版本。另一方面,如果您没有使用结构中的值进行太多计算,则此转换将是浪费。