ABI vs C++ Standard

ABI vs C++ Standard

本文关键字:Standard C++ vs ABI      更新时间:2023-10-16

我正在努力理解ABI(比如System V)和C++标准之间的区别。因此,C++标准只是确定了合法的C++,这样编译器就可以将其转换为适当的汇编代码。ABI随后规范了该汇编代码如何与x86体系结构交互?这是两者之间更高层次的比较吗?

我之所以这么问,是因为我对低延迟软件感兴趣,我想知道阅读ABI会有多大价值

该标准根据您编写的代码定义程序应该做什么。ABI定义了如何为特定平台实现这一点,以便在不同运行中编译的代码(可能由不同的编译器/版本编译)可以进行交互。

也就是说,当你写:

void f(int i) { std::cout << i; }

该标准定义了行为:对该函数的调用将导致参数值的打印输出。ABI决定如何生成程序集,以便可以调用函数(f的名称是如何损坏的?)参数可以传入(参数是否在堆栈中?寄存器中?)。

关于问题的大胆部分。。。好吧,这取决于情况。ABI阅读量很大,很难阅读和理解。但您至少应该熟悉一些基本知识,比如调用约定(传递T类型的对象的成本是多少?)。。。除此之外,我会将其作为一种被动的方法:概况,如果你需要了解正在发生的事情,ABI可能会有所帮助。

大多数程序员不知道他们平台的ABI,他们过着同样快乐的生活。为了理解程序行为的一些特殊性,我特别来回了几次。

对于您的直接问题:了解ABI将在一定程度上帮助您。但是ABI不会告诉你在特定的C++应用程序中什么是有效的——例如,使用内联的效果——这可能是有益的,也可能是有害的。类似地,在某些情况下,选择使用vector与C风格的数组可能会带来好处,但在其他情况下,它的区别太小,不值得从一个数组更改为另一个数组。

低延迟软件更多的是了解编译器对某些特定代码的总体操作,而不是确切地知道ABI第13.6.2段中关于VTABLE是如何组织的——当然,您正在编译的特定代码直接受到VTABLE布局的影响-大多数时候这不是问题(除了理解虚拟函数是一个间接调用之外,它可能比相应的直接调用慢一点,对于简单函数来说,它将比函数的内联版本慢得多

您当然关心"有多少寄存器用于传递参数"之类的问题,但了解编译器是使用R0、R1、R2还是R13、R14和R15作为传递参数的三个寄存器就不那么重要了。

最重要的是,无论你多么了解编译器的功能,查看汇编程序输出、通过分析器运行代码等,都会比阅读ABI规范告诉你更多关于它的信息。请记住,在典型的代码中,90%的时间都花在了10%的代码中。修复一个使用总运行时间0.001%的函数的"缓慢"可能是浪费精力。