内存对齐 - 在 C 语言中执行编译指示包(1) 有什么缺点?



可能重复:
使用杂注包(1(时是否存在性能问题?

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

性能会变慢。

整数(和其他数据类型(不是在"偶数"内存边界上,如果它们可以很容易地访问,它们可能会"跨越"内存边界,并需要两次提取(CPU周期(才能检索它们。

有几个"缺点":

  1. 这不是C。这是一些C编译器中特定于实现的破解。

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

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

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

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

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

最新更新