ABI vs C++ Standard
ABI vs C++ Standard
我正在努力理解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%的函数的"缓慢"可能是浪费精力。
- 我需要安装什么才能获得在Windows Server 2012 R2 Standard上运行C++hello world
- 为什么"non-standard syntax; use '&' to create a pointer to member"在 CTOR 中使用线程?
- 函数参数中的向量"Non-standard syntax"错误
- 什么是"Reading unbounded stream from standard input (Memory Management)"的例子
- C++ standard: ODR and constexpr std::string_view
- UCRTbase.dll涉及TCP通信的C ++ Windows Embedded Standard崩溃
- 如果它被定义为 C++ 类中的成员函数,我得到了"non-standard syntax; use '&' to create a pointer to member"
- Visual Studio 2015:获取"non standard syntax, use '&' to create a pointer to member"错误
- 有没有没有"standard bugs" C++方言?
- 在 Xcode 4.5 中,"C++ Standard Library"和"C++ Language Dialect"的"Compiler Default"是什么?
- a standard blowfish API for C++?
- 我如何接受"standard input commands",然后知道何时继续运行该程序?
- 将 MSVS 2010 项目转换为 MSVS 2012 RC,但出现错误"The C++ standard doesn't provide a hash for this type"
- "Standard I/O only" Windows 下的权限
- C++ MPI standard 3
- Visual Studio C++ Standard Regex get tag till whitespace
- 在 VB6 中创建的 "standard" DLL 在 Python 中调用时会出现访问冲突
- 编译作品,开始不 - "standard path" ?
- Visual Studio 2015 "non-standard syntax; use '&' to create pointer for member"
- ABI vs C++ Standard