【问题标题】:platform specific placement of alignment padding in C structuresC 结构中对齐填充的平台特定位置
【发布时间】:2012-09-01 14:38:41
【问题描述】:

除非使用打包编译器选项或 pragma,否则代码如下(假设 8 位 char 和 16 位 short)

struct foo
{
   short a ;
   char  b ;
   short c ;
} ;

据我所知,在我们的产品支持的所有平台(不少)上,c 之前的 1 个字节的对齐焊盘最终会结束。

我不记得有任何平台没有在bc 之间放置对齐填充,但想象一下编译器可以合法地将填充放在ab 之间。

(动机:我们在代码中引入了一些基础设施,以确保当前写入磁盘或涉及网络流的某些结构的二进制兼容性,并且在可能的情况下,希望插入显式填充以便其他开发人员知道这些数据结构在幕后消耗的额外存储空间)。

是否有人知道一个平台,其编译器不会在需要时将对齐填充放在紧邻否则将不对齐的成员之前?

【问题讨论】:

  • 有趣的问题。我很好奇你为什么以这种方式问你关于这个 C 危险区的问题,你愿意分享你的动机吗?
  • 如果某些平台将shorts 和chars 对齐到4 个字节怎么办?在未来的平台上可能有充分的理由,例如:gcc.gnu.org/wiki/Atomic/GCCMM/DataRaces
  • 我强烈推荐阅读Write Portable Code。使用结构序列化数据不是一个好主意。包装和字节序每次都会让你受益。
  • 谢谢,我会把那本书放在我的阅读清单中。但是请注意,我们的产品(IBM 的 DB2 服务器)非常庞大,并且在这样的代码库中有很多动力和惯性。在不久的将来,不使用结构来序列化数据不是一种选择。

标签: c alignment


【解决方案1】:

据我所知,它在任何地方都不是默认设置,但 MSVC(和 gcc,我相信,为了兼容性)支持 #pragma pack,它允许控制结构打包并允许未对齐的访问。

基本上,任何对 C 结构字节布局的假设都是自找麻烦。这样做的代码也容易落入对单词字节序进行假设的陷阱,这在通用平台之间绝对是不兼容的。

【讨论】:

  • #pragma pack 是我在问题中所说的“打包编译指示”。我对不使用 #pragma pack 或等效(邪恶)编译器选项时的默认行为感兴趣。
  • 我再重复一遍我的警告:如果您对结构布局做出假设,那么您将来将面临可怕的可移植性错误。不要那样做。烹饪你的存储,不要腌制记忆。
猜你喜欢
  • 1970-01-01
  • 2018-03-04
  • 2016-04-10
  • 2021-12-28
  • 2015-09-30
  • 2020-07-26
  • 2014-10-13
  • 2016-09-18
  • 2011-10-19
相关资源
最近更新 更多