C ++ ABI问题列表

我已经看到很多关于C ++如何不像C那样拥有标准ABI的讨论。 我很好奇这个问题到底是什么。 到目前为止,我已经想出了

  1. 名称捣毁
  2. exception处理
  3. RTTI

是否还有其他与C ++有关的ABI问题?

closures我的头顶上:

C ++具体:

  • 哪里可以find这个参数。
  • 如何调用虚函数
    • 即它使用一个Vtable或其他
    • 什么是用于实现这个结构的布局。
  • 如何处理多个定义
    • 多个模板实例
    • 没有内联的内联函数。
  • 静态存储时间对象
    • 如何处理创作(在全球范围内)
    • 如何处理本地函数的创build(如何将它添加到析构函数列表中)
    • 如何处理破坏(以相反的顺序销毁)
  • 你提到例外。 但是在main()之外如何处理exception
    • 即在main()之前或之后

通用。

  • parameter passing位置
  • 返回值的位置
  • 会员一致
  • 填充
  • 注册使用(哪些寄存器被保留,是划痕)
  • 原始types的大小(如int)
  • 原始types的格式(浮点格式)

根据我的经验,最大的问题是C ++标准库。 即使你有一个ABI来指定一个类应该如何布局,不同的编译器提供了不同的标准对象的实现,比如std::stringstd::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一个定义良好的行为)之外,它还包括未指定的行为,实现定义的行为,特定于语言环境的行为和公共扩展。