在最近的一次采访中,有人问我关于 C++ 结构字段对齐的问题,并且理论上 C 和 C++ 在结构打包中遵循相同的策略。
但是,这是错误的假设。面试官说,通常 C 和 C++ 以不同的方式打包结构,我们不应该期望相反。恕我直言,这是奇怪的说法。 C++ 中的结构没有 pack "C"
限定符,可用于双语 C/C++ 头文件。
因此在实践中,这可能意味着您不能在 C++ 中创建结构并将其传递给 C 库,因为通常它的字段将以不同的方式对齐并具有不同的偏移量。但事实上,大多数程序员在将指针转换为 C POD 之前都非常依赖这种互操作性。 struct 使用一些辅助方法对该结构的 C++ 包装器的引用。你能澄清一下这个问题吗?
最佳答案
C 和 C++ 语言标准都没有对结构填充的要求,而是将其作为编译器实现的细节。对此的严格解释意味着不能保证两者之间的结构是相同的。
然而,在实践中,如果需要,可以同时支持 C 和 C++ 的工具链的给定版本(例如 GCC 或 Clang)可以以相同的方式打包相同的结构。没有这个,世界上的许多生产代码根本无法工作。然而,这是工具链提供的保证,不是语言。
值得注意的是,如果你要声明一个与 C 原版类似的结构,但添加了访问说明符(private
、public
和 protected
),布局会改变,但这有点牵强,因为结构不再相同。
关于c++ - C 与 C++ 结构对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33835569/