【问题标题】:ABI vs C++ StandardABI 与 C++ 标准
【发布时间】:2013-07-01 05:24:06
【问题描述】:

我试图了解 ABI(比如 System V)和 C++ 标准的区别。因此,C++ 标准只是确定了合法的 C++,以便编译器可以将其转换为足够的汇编代码。然后 ABI 规范了这个汇编代码如何与 x86 架构交互?这是两者之间更高层次的比较吗?

我问的原因是对低延迟软件感兴趣,我想知道阅读 ABI 会包含多少价值?

【问题讨论】:

标签: c++ assembly x86 cpu abi


【解决方案1】:

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

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

您当然关心诸如“使用多少个寄存器来传递参数”之类的事情,但是知道编译器是使用 R0、R1、R2 还是 R13、R14 和 R15 作为三个寄存器来传递参数并不重要。

最重要的是,无论您认为您了解编译器的功能,查看汇编器输出,通过分析器运行代码等,都将比阅读 ABI 规范提供更多信息。请记住,在典型的代码中,90% 的时间花在 10% 的代码上。修复使用 0.001% 总运行时间的函数的“缓慢”可能是浪费精力。

【讨论】:

  • 嗨。您说“在某些情况下,选择使用向量与 C 样式数组可能会带来好处”。如果你指的是延迟,你的意思是相反吗? C风格的数组而不是向量? Vector在任何情况下都不能更快吗?
  • 是的,我的意思是有时 C 数组比向量快一点。但我的主要观点是,有时会有很大的不同,有时根本没有区别,如果你真的需要动态存储(因此,你的数组实际上是一个指针),或者你传递数组(再次转动它变成指针),好处可能会完全消失。
  • 我完全同意——很高兴知道某个地方详细说明了 Linux 通过寄存器传递的参数多于堆栈的事实,我想知道 ABI 中还埋藏着什么其他“黄金宝藏”。
【解决方案2】:

该标准根据您编写的代码定义程序应执行的操作。 ABI 定义了特定平台的实现方式,以便在不同运行中编译的代码(可能由不同的编译器/版本)可以交互。

也就是说,当你写的时候:

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

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

关于问题的粗体部分......好吧,这取决于。 ABI 是重读,很难阅读和理解它们。但是您至少应该熟悉一些基础知识,例如calling conventions(传递T 类型的对象的成本是多少?)...除此之外,我将采用一种反应式方法:配置文件,如果您需要了解发生了什么,ABI 可能会有所帮助。

大多数程序员不了解他们平台的 ABI,但他们过得很愉快。为了了解程序行为的一些特殊性,我特别来回走了几次。

【讨论】:

    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2011-04-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多