什么时候不应该使用#pragma pack?

psa*_*ora 16 c structure

在C中,当我们使用结构时,何时使用#pragma pack指令是不合适的?

问题的补充......

有人可以解释更多关于如何使用指针访问未对齐数据失败的问题吗?

And*_*ell 39

固件开发人员在这里. #pragma pack是非常熟悉的领域.我会解释一下.

一般来说,你不应该使用#pragma pack.是的,它会使你的结构在内存中变小,因为它消除了struct成员之间的所有填充.但它可以使访问这些成员更加昂贵,因为成员可能不再符合他们的要求.例如,在ARM体系结构中,4字节整数通常需要4字节对齐,但在压缩结构中它们可能不是.这意味着编译器需要添加额外的指令来安全地访问该struct成员,或者开发人员必须逐个字节地访问它并手动重建int.无论哪种方式,它都会产生比对齐访问更多的代码,因此您的结构最终会变小,但您的访问代码可能会变得越来越慢.

应该#pragma pack在结构必须与精确数据布局匹配时使用.当您编写匹配数据传输或访问规范的代码时,通常会发生这种情况...例如,网络协议,存储协议,访问HW寄存器的设备驱动程序.在这些情况下,您可能需要#pragma pack强制您的结构与规范定义的数据布局相匹配.这可能会导致前一段中提到的相同性能损失,但可能是遵守规范的唯一方法.

  • R ..你能举几个"处理这种情况的其他方法"的例子吗?我也总是使用#pragma pack,就像安德鲁建议的那样.谢谢. (17认同)
  • 根据我在嵌入式平台和网络通信方面的经验,我发现#pragma pack非常有用.如果您知道如何为给定的体系结构(和编译器)正确地排序和对齐结构,那么性能就不会降低. (7认同)
  • -1表示"你应该使用#pragma pack".有很多其他方法来处理这种情况,实际上是有效的C. (2认同)