【问题标题】:How to avoid structure padding?如何避免结构填充?
【发布时间】:2015-04-05 02:57:06
【问题描述】:

我很想知道#pragma 将如何帮助避免结构填充(请给我一个程序来理解它)。

默认情况下,编译器将以对齐的方式分配内存。那么通过避免结构填充,程序员会得到什么好处呢? 什么时候需要避免结构填充?

【问题讨论】:

  • 它不是 C 标准的一部分,但编译器有办法将其作为扩展处理。然而,不同的编译器做的不同,如果你需要帮助,你必须告诉我们你正在使用什么编译器。您可能还想告诉我们为什么您想要它。
  • 忠告:你不需要它,你不需要它。避免它,除非它是绝对必要的。
  • 我正在使用 gcc 编译器。
  • #pragma pack (1) 禁用字节填充,#pragma pack () 重新启用它。

标签: c memory-management structure padding


【解决方案1】:

这些技术取决于编译器。

除了可能减少程序消耗的内存量之外,好处通常并不多。这种好处只在资源(例如内存)很少的机器上才值得,这意味着现代硬件很少需要它。

在实践中,代价是性能降低或硬件异常。填充的常见目的是通过以适合主机系统的方式对齐结构成员来提高性能和避免硬件异常。禁止填充基本上会关闭填充的所有好处。

节省几个字节,甚至几千字节,在性能或更多错误条件方面的影响很少值得。如果您正在进行某些类型的开发(例如在资源有限的嵌入式系统上),这可能是值得的,但即便如此也并非总是如此。

【讨论】:

  • 在嵌入式系统中,结构化封装的好处不仅仅是节省空间。例如,您可能通过通信收到了一个打包字节数组,并希望对其进行解释。您可以将其转换为结构并使用字段,而不是逐字节复制和转换。当然,您必须确保字节顺序和 MSB 与消息相同,并且处理器允许未对齐访问。
【解决方案2】:

1.在资源关键嵌入式系统的情况下,主要避免结构填充。在这种情况下,通过以代码内存为代价打包结构成员来节省 RAM(需要更多指令来访问打包的结构成员)。

  1. 在某些情况下,字节数组会映射到结构成员以便于访问。

【讨论】:

    【解决方案3】:

    使用预处理指令#pragma 1 可以避免结构填充 编译器会以 1 的倍数分配内存

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      相关资源
      最近更新 更多