Min*_*eat 62 c c++ struct pointers object-layout
我在最近的一次采访中被问到有关C++结构字段对齐的问题,并且理论上C和C++在结构打包中遵循相同的策略.
Hovewer,这是错误的假设.采访者说,一般来说,C和C++以不同的方式包装结构,我们永远不应该期待相反的结果.恕我直言,这是一个奇怪的声明.pack "C"在C++中没有用于双语C/C++头文件的结构限定符.
因此在实践中,它可能意味着您无法在C++中创建结构并将其传递给C库,因为通常它的字段将以不同的方式对齐并具有不同的偏移量.但实际上,大多数程序员都非常依赖这种互操作性,直到他们将一个指向C POD结构的指针转换为对这个结构的C++包装器的引用,并使用了一些辅助方法.你能澄清一下这个问题吗?
Sam*_*all 68
C和C++语言标准都没有对struct padding的要求,并将其作为编译器实现细节.对此的严格解释意味着无法保证两者之间的结构相同.
然而,在实践中,如果需要,能够同时使用C和C++(例如GCC或Clang)的工具链的给定版本可以以相同的方式打包相同的结构.如果没有这个,世界上许多生产代码根本就行不通.然而,这是工具链给出的保证,而不是语言.
值得注意的是,如果要声明与C原始类似的结构,但添加了访问说明符(private,public和protected),则布局会发生变化,但由于结构不再相同,所以这有点延伸.
Ser*_*eyA 29
这显然是错误的(在面试官方面).很明显,对于任何使用任何处理结构的低级API的人来说,结构打包与C和C++是相同的- 例如,网络API.所有这些都是C函数,它接受'C'结构,但它们在C++代码中被安全地称为数百万次.
你应该很幸运,你有这个问题.它清楚地表明你不应该在那里工作.
| 归档时间: |
|
| 查看次数: |
4076 次 |
| 最近记录: |