C++ ABI问题列表

Pup*_*ppy 43 c++

我已经看到很多关于C++如何没有标准ABI的讨论与C一样.我很好奇究竟是什么问题.到目前为止,我已经想到了

  1. 名字错误
  2. 异常处理
  3. RTTI

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

Mar*_*ork 42

脱离我的头顶:

C++特定:

  • 可以找到'this'参数的位置.
  • 如何调用虚函数
    • 即它是否使用vtable或其他
    • 用于实现此目的的结构的布局是什么.
  • 如何处理多个定义
    • 多个模板实例化
    • 未内联的内联函数.
  • 静态存储持续时间对象
    • 如何处理创建(在全局范围内)
    • 如何处理本地函数的创建(如何将其添加到析构函数列表)
    • 如何处理破坏(以创建的相反顺序销毁)
  • 你提到例外.但是如何在main()之外处理异常
    • 即在main()之前或之后

通用.

  • 参数传递位置
  • 返回值位置
  • 成员对齐
  • 填充
  • 注册用法(保留哪些寄存器为临时)
  • 原始类型的大小(例如int)
  • 原始类型的格式(浮点格式)


Lin*_*cer 24

根据我的经验,最大的问题是C++标准库.即使你有一个ABI来决定如何布置类,不同的编译器提供了标准对象的不同实现,如std::stringstd::vector.

我并不是说标准化C++库对象的内部布局是不可能的,只是以前没有做过.

  • @Tux -D在Visual Studio 2008中更改编译器选项以获得`std :: vector`的不兼容布局就足够了. (3认同)
  • @Tux-D:他们有不同的接口.当成员函数内联时,接口包括私有对象的布局,而不仅仅是标准中定义的公共接口.标准未指定许多实现细节.举个例子:小字符串优化. (3认同)

ysd*_*sdx 9

我们对标准C++ ABI最接近的是Itanium C++ ABI:

本文档是作为通用规范编写的,可供各种体系结构上的C++>实现使用.但是,它确实包含用于Itanium 64位ABI的特定于处理器的材料,标识为这样."

GCC文档解释了支持这一ABI对C++的:

从GCC 3.2开始,C++的GCC二进制约定基于一个独立于供应商的书面C++ ABI,它专门针对64位Itanium,但也包括适用于任何平台的通用规范.这个C++ ABI也在某些平台上由其他编译器供应商实现,特别是GNU/Linux和BSD系统

正如@Lindydancer所指出的,您还需要使用相同的C++标准库/运行时.

  • 正如@Lindydancer所说,Linux上的C++库的二进制兼容性更多地与单个通用和普遍使用的C++运行时库(由g ++提供)相比,而不是ABI. (4认同)

小智 5

任何语言的ABI标准确实需要来自想要支持这种事物的给定平台.语言标准尤其是C/C++实际上由于许多原因无法做到这一点,但主要是因为这样的事情会使语言不那么灵活,便于携带,因此使用较少.C确实没有定义的ABI,但许多平台(直接或间接)定义了一个.C++没有发生这种情况的原因是因为语言更大并且更频繁地进行更改.但是,Herb Sutter提出了一个非常有趣的建议,即如何获得更多平台来创建标准ABI,以及开发人员如何编写以标准方式使用ABI的代码:

https://isocpp.org/blog/2014/05/n4028

他指出C++如何通过extern"C"链接到平台C ABI而不是C++ ABI的标准方法.我认为这个提议可以在很大程度上允许用C++而不是C语言来定义接口.