什么是GCC手册中提到的"C++ ABI规范"?

joh*_*dav 4 c++ x86 gcc x86-64 language-lawyer

我正在查看GCC的C++手册,我看到了以下引用:

版本0指的是与C++ ABI规范最接近的版本.因此,使用版本0获得的ABI将在不同版本的G ++中发生变化,因为ABI错误是固定的.(来源)

可以看出,上面的段落引用了某种看似标准的C++ ABI.但据我所知,没有这样的ABI存在.这篇文章在谈论什么?一个好的答案将给出尽可能详尽的解释.将"C++ ABI规范"放入我首选的搜索引擎并没有什么用处.

Sha*_*our 7

我们可以从WG21提案中看到N4028定义一个可移植的C++ ABI gcc所指的是Common Vendor ABI(Itanium C++ ABI):

现有实践的现有实践
示例包括:
- 公共供应商ABI(Itanium C++ ABI)是朝这个方向迈出的一步,在某些平台上为该语言指定ABI.今天它得到了GCC和EDG等编译器的支持.它没有为标准库指定ABI,所以这是必要的,但不足以,例如,使用std :: stringon一个稳定的API边界
- 微软VC++同样长期以来有一个事实上稳定的,虽然没有文档,ABI的语言.它没有标准库的稳定ABI,而是故意破坏每个主要版本的ABI兼容性,例如为了允许持续改进实现并快速实现包含ABI中断更改的新标准库.
...

gcc还在其ABI政策和指南中涵盖了这一点:

...此外,编译成目标文件的C++源代码由编译器转换:它按特定的布局排列对象,根据定义明确的算法修改名称,具有支持虚函数的特定安排这些细节被定义为编译器应用程序二进制接口或ABI.从GCC版本3开始,GNU C++编译器使用行业标准的C++ ABI,即Itanium C++ ABI....