在最近的一次访谈中,我被问及C++ struct 域的对齐方式,并在C struct 中用C和C++来遵循相同的策略.

霍维尔,这是错误的假设.采访者说,一般来说,C和C++都是用不同的方式来包装 struct ,我们永远都不要期望相反的东西.这是一个奇怪的说法.C++中的pack "C"个 struct 限定符用于双语C/C++头文件.

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

推荐答案

C语言和C++语言标准都不要求 struct 填充,而将它留给编译器实现细节.对这一点的严格解释意味着不能保证两者之间的 struct 是相同的.

然而,在实践中,一个给定的版本,能够同时具有C和C++(如GCC或Clang)的工具链可以以相同的方式打包相同的 struct ,如果需要的话.如果没有这一点,世界上很多生产代码根本无法工作.然而,这是工具链和语言给出的保证.

值得注意的是,如果您要声明一个与C原始 struct 类似的 struct ,但添加了访问说明符(privatepublicprotected),那么布局会发生变化,但这有点牵强,因为该 struct 不再相同.

C++相关问答推荐

新的memaligning函数有什么用?

代码打印正确输出次数过多(CS50)

数组元素的编号索引

理解没有返回语句的递归C函数的行为

如何在Visual Studio代码中关闭此函数名称显示功能?

如何在IF语句中正确使用0.0

如果包含路径不存在,我的编译器可以被配置为出错吗?(GCC、MSVC)

函数内的局部字符指针

如何在VS 2022中正确安装额外的C头文件

Fprintf正在写入多个 struct 成员,并且数据过剩

静态初始化顺序失败是否适用于C语言?

为什么GCC 13没有显示正确的二进制表示法?

C中的数组下标和指针算法给出了不同的结果

C:面筋蛋白';为什么不刷新窗口?

%g浮点表示的最大字符串长度是多少?

函数指针作为函数参数 - 应该使用 const 吗?

是什么阻止编译器优化手写的 memcmp()?

从管道读取数据时丢失

OpenGL 中的非渐变 colored颜色 变化

仅使用其内存地址取消引用 C 中的 struct