C ++ ABI问题列表
我已经看到很多关于C ++如何不像C那样拥有标准ABI的讨论。 我很好奇这个问题到底是什么。 到目前为止,我已经想出了
- 名称捣毁
- exception处理
- RTTI
是否还有其他与C ++有关的ABI问题?
closures我的头顶上:
C ++具体:
- 哪里可以find这个参数。
- 如何调用虚函数
- 即它使用一个Vtable或其他
- 什么是用于实现这个结构的布局。
- 如何处理多个定义
- 多个模板实例
- 没有内联的内联函数。
- 静态存储时间对象
- 如何处理创作(在全球范围内)
- 如何处理本地函数的创build(如何将它添加到析构函数列表中)
- 如何处理破坏(以相反的顺序销毁)
- 你提到例外。 但是在main()之外如何处理exception
- 即在main()之前或之后
通用。
- parameter passing位置
- 返回值的位置
- 会员一致
- 填充
- 注册使用(哪些寄存器被保留,是划痕)
- 原始types的大小(如int)
- 原始types的格式(浮点格式)
根据我的经验,最大的问题是C ++标准库。 即使你有一个ABI来指定一个类应该如何布局,不同的编译器提供了不同的标准对象的实现,比如std::string
和std::vector
。
我并不是说它不可能标准化C ++库对象的内部布局,只是以前没有做过。
我们对标准C ++ ABI最接近的是Itanium C ++ ABI :
本文档是作为通用规范编写的,可以在各种体系结构上使用C ++>实现。 但是,它确实包含针对Itanium 64位ABI的特定于处理器的材料,如此标识。“
GCC文档解释了对于C ++的ABI的支持:
从GCC 3.2开始,用于C ++的GCC二进制约定基于书面的,供应商中立的C ++ ABI,专门针对64位Itanium,但也包括适用于任何平台的通用规范。 这个C ++ ABI也由其他编译器厂商在一些平台上实现,特别是GNU / Linux和BSD系统
正如@Lindydancer所指出的那样,您也需要使用相同的C ++标准库/运行库。
任何语言的ABI标准都需要来自特定的平台,以支持这样的事情。 语言标准尤其是C / C ++实际上不能这么做,原因很多,主要是因为这样会使得语言的灵活性降低,便携性降低,因此使用率降低。 C实际上没有定义的ABI,但许多平台(直接或间接)定义了一个。 C ++没有发生这种情况的原因是因为语言要大得多,变化也要频繁。 然而,Herb Sutter对于如何获得更多的平台来创build标准的ABI以及开发人员如何以标准的方式编写使用ABI的代码提出了一个非常有趣的build议:
https://isocpp.org/blog/2014/05/n4028
他指出C ++如何通过extern“C”链接到平台C ABI而不是C ++ ABI。 我认为这个提议可以用很长的一段时间来让接口可以用C ++而不是C来定义。
我已经看到了很多有关C ++如何不像C那样拥有标准ABI的讨论。
什么标准C ABI? C99标准中的附录J长27页。 除了未定义的行为(并且一些实现给UB一个定义良好的行为)之外,它还包括未指定的行为,实现定义的行为,特定于语言环境的行为和公共扩展。