1

你好社区我在看 C++ 程序集,我已经从 PARSEC 套件编译了一个基准,我很难知道他们如何用汇编语言命名类属性函数。例如,如果我有一个带有一些函数来操作它的类,在 cpp 中我们称它们为test.increment(); 经过一番调查后我发现这个函数是

atomic_load_acq_ptr

表示为:

_ZL19atomic_load_acq_intPVj

在组装中,或者至少这是我发现的。

让我知道我是否错了!映射有一些固定的规则吗?还是它们是随机的?谢谢

4

4 回答 4

6

它被称为名称修改,由于重载和模板等原因是必要的(即普通的字符和数字名称不足以明确识别代码块;在名称中嵌入空格或<>::通常是不合法的;复制未压缩的、人类可读形式的附加信息将是浪费的),因此它取决于类型、arity 等。

确切的方案可能会有所不同,但通常每个编译器在相当长的时间内都是自洽的(有时甚至几个编译器都可以满足于一种方式)。

于 2011-02-07T11:17:51.323 回答
2

C++允许函数重载,这意味着一个函数可以有两个同名但参数不同的函数。由于您的二进制格式不理解类型,这是一个问题。解决这个问题的方法是使用一种称为名称修饰的方案。这会将类型信息的整个函数添加到源文件中使用的名称中,并确保调用正确的重载。

添加的额外字母等由正在使用的特定应用程序二进制接口 (ABI) 管理。不同的编译器(有时甚至是不同的版本)可能使用不同的 ABI。

于 2011-02-07T11:22:36.783 回答
2

这就是所谓的名字修饰。. 它依赖于编译器。没有标准的方式,对不起:)

于 2011-02-07T11:18:18.203 回答
0

是的,有一种创建这些符号的标准方法,称为名称修饰。

于 2011-02-07T11:20:16.133 回答