c++ - C 与 C++ 结构对齐

标签 c++ c pointers struct object-layout

在最近的一次采访中,有人问我关于 C++ 结构字段对齐的问题,并且理论上 C 和 C++ 在结构打包中遵循相同的策略。

但是,这是错误的假设。面试官说,通常 C 和 C++ 以不同的方式打包结构,我们不应该期望相反。恕我直言,这是奇怪的说法。 C++ 中的结构没有 pack "C" 限定符,可用于双语 C/C++ 头文件。

因此在实践中,这可能意味着您不能在 C++ 中创建结构并将其传递给 C 库,因为通常它的字段将以不同的方式对齐并具有不同的偏移量。但事实上,大多数程序员在将指针转换为 C POD 之前都非常依赖这种互操作性。 struct 使用一些辅助方法对该结构的 C++ 包装器的引用。你能澄清一下这个问题吗?

最佳答案

C 和 C++ 语言标准都没有对结构填充的要求,而是将其作为编译器实现的细节。对此的严格解释意味着不能保证两者之间的结构是相同的。

然而,在实践中,如果需要,可以同时支持 C 和 C++ 的工具链的给定版本(例如 GCC 或 Clang)可以以相同的方式打包相同的结构。没有这个,世界上的许多生产代码根本无法工作。然而,这是工具链提供的保证,不是语言。

值得注意的是,如果你要声明一个与 C 原版类似的结构,但添加了访问说明符(privatepublicprotected),布局会改变,但这有点牵强,因为结构不再相同。

关于c++ - C 与 C++ 结构对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33835569/

相关文章:

c++ - C++ 标准规定的整数范围

c++ - 接口(interface)描述中接口(interface)方法的预定义参数列表

java - 数据库文件结构和索引及实现

char *str[ ] 通过引用传递不起作用

C++11 编译器 : Closest to the standard and how close?

c++ - 使用嵌套的 if 语句来构造代码

c - c 中的内存是如何分配的,为什么两个连续的内存之间的差异总是4?

c - 在 c 中放入数组后打印元素

c重新分配(): invalid next size

变量周围的 C++ 堆栈已损坏