2013-07-03 36 views
3

我想了解ABI(比如系统V)和C++标准的区别。所以C++标准只是确定合法的C++,以便编译器可以将其转换为适当的汇编代码。然后ABI规定这个汇编代码如何与x86架构交互?这两者之间的更高层次的比较?ABI vs C++标准

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

+0

[如果C/C++定义了一个标准的ABI,它会“丢失”什么东西?](http://stackoverflow.com/questions/2083060/what-c​​ould-cc-lose-if-they-defined- a-standard-abi) – duDE

+0

有* 1 * C++标准,有*许多* ABI和处理器体系结构。避免绘图比较。 –

+0

@HansPassant我的问题的重点是做一个比较?! ABI的目的是什么,它有什么不同? – user997112

回答

5

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

也就是说,当你写:

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

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

关于问题的大胆部分......好吧,这取决于。 ABI是繁重的阅读,很难阅读和理解它们。但是你至少应该熟悉一些基础知识,比如calling conventions(传递一个T类型的对象的代价是多少?)......除此之外,我会做出一个被动的方法:profile,如果你需要了解什么ABI可能会有所帮助。

大多数程序员不知道他们的平台ABI,他们生活愉快。我特别多次来回地了解节目行为的一些特点。

4

对于你的直接问题:了解ABI将在一定程度上帮助你。但ABI不会告诉你在特定的C++应用程序中效率如何 - 例如,使用内联的效果 - 这可能是有益的和有害的。同样,使用vector与C风格数组的选择在某些情况下可能会带来好处,但在其他地方,它们几乎没有什么区别,因此不值得从一个变为另一个。

低延迟软件更多的是了解编译器做什么一般来说,用一些特定的代码段,而不是完全知道ABI的第13.6.2节中关于VTABLE是如何组织的 - 除了当然您正在编译的特定代码直接受VTABLE布局的影响 - 大部分时间不是问题(除了了解虚拟函数是间接调用,它可能比相应的直接调用慢一点,并且对于简单函数将会明显比函数的内联版本要慢

你当然会关心诸如“有多少寄存器被用来传递参数”,但知道编译器是否使用R0,R1,R2或R13,R14和R15作为三重Gisters传递论据的重要性要小得多。

而且最重要的是,不管你多么想你了解编译器做什么,看着汇编输出,通过分析器运行代码等,会告诉你更多关于它比阅读ABI规范。请记住,在典型的代码中,90%的时间花费在10%的代码中。修正使用总运行时间的0.001%的函数的“缓慢”可能是浪费精力。

+0

嗨。你说过“在某些情况下使用vector与C风格数组的选择可能会带来好处”。如果你指的是延迟,你的意思是否相反? C风格的数组而不是向量?矢量不能在任何情况下都能更快吗? – user997112

+0

是的,我的意思是说,有时候C数组比矢量快一点。但我的主要观点是,有时会有很大的差异,有时候根本没有什么区别,如果你真的需要动态存储(因此,你的数组实际上是一个指针),或者你将数组传递给它成指针),好处可能完全消失。 –

+0

我完全同意 - 很高兴知道有一个地方详细说明了Linux通过寄存器传递更多参数的事实,而不是堆栈,我想知道在ABI中埋藏了什么其他“黄金宝藏”。 – user997112