什么是C++;函数重载? 我最近一直试图把C++的基本原理翻译成汇编代码,但有一件事对我来说还没有意义。函数重载实际上是如何从C++代码转换成汇编代码的?程序集仅支持具有唯一性的过程。那么C++中函数重载的机制是什么呢?它是某种函数指针在工作,还是在调用宏?我在网上找不到这方面的相关文章

什么是C++;函数重载? 我最近一直试图把C++的基本原理翻译成汇编代码,但有一件事对我来说还没有意义。函数重载实际上是如何从C++代码转换成汇编代码的?程序集仅支持具有唯一性的过程。那么C++中函数重载的机制是什么呢?它是某种函数指针在工作,还是在调用宏?我在网上找不到这方面的相关文章,c++,function,assembly,overloading,C++,Function,Assembly,Overloading,是否所有编译器都遵循任何特定的技术,或者技术是否有所不同?作为@n.“代词m。还有一些人在评论中说,编译器在汇编中为每个单独的函数重载指定了一个特殊的名称。该名称对函数名和参数类型进行编码。因此,不同的函数重载在程序集中是有区别的,无论是在声明时还是在调用时。作为@n.代词m。还有一些人在评论中说,编译器在汇编中为每个单独的函数重载指定了一个特殊的名称。该名称对函数名和参数类型进行编码。因此,在声明和调用时,汇编中会区分不同的函数重载。TL:DR:重载基本上是源代码级别的事情,使arg类型成为函

是否所有编译器都遵循任何特定的技术,或者技术是否有所不同?

作为@n.“代词m。还有一些人在评论中说,编译器在汇编中为每个单独的函数重载指定了一个特殊的名称。该名称对函数名和参数类型进行编码。因此,不同的函数重载在程序集中是有区别的,无论是在声明时还是在调用时。

作为@n.代词m。还有一些人在评论中说,编译器在汇编中为每个单独的函数重载指定了一个特殊的名称。该名称对函数名和参数类型进行编码。因此,在声明和调用时,汇编中会区分不同的函数重载。

TL:DR:重载基本上是源代码级别的事情,使arg类型成为函数“name”的一部分。手写asm中没有真正的等价物。Asm甚至没有类型系统;您可以使用合理的指令来处理寄存器中的位模式

C++编译器通过使用“名称混乱”在asm中实现它,因此
foo(int,int)
的asm符号名是例如
\u Z3fooii
。()


<>强> C++中的函数重载在编译时静态解析。不涉及函数指针或任何其他运行时诡计。

它有效地使args的类型成为函数名的一部分。因此,对于手工编写的asm,等价物可以是一些简单的手动方案,如
foo_int
foo_float
foo_int_int
,等等。每个方案都有一个单独的定义,就像3个名称完全不同的单独函数一样

C++比asm支持更多的代码重用(尤其是通过模板)。您可以想象尝试在asm中使用宏执行某些操作,其中可能有一个宏arg,它是类似
int
之类的字符串。但是,除非宏仅将对其他函数的调用缝合在一起(通过将字符串固定到某个基本名称,如
调用foo\u%1
/
mov rdi、rax
/
调用条\u%1
),否则这在asm中并不真正起作用(因为每个真正起作用的指令都必须使用正确大小的寄存器)


我想对于以寄存器名称作为宏参数的宏,它可能会扩展到
添加rax、rsi
添加eax、esi
,具体取决于调用方传递的内容,并且它可以传递
long
int
进行匹配。(因此,宏就像一个模板函数,类型作为模板参数;重载只存在于使用类型名称作为asm符号名称一部分的调用中。)这当然只能在有限的情况下工作。e、 g.
float
在大多数ISA上需要不同于
int
long
的助记符,以及不同的寄存器名。

TL:DR:重载基本上是源代码级的事情,使arg类型成为函数“name”的一部分。手写asm中没有真正的等价物。Asm甚至没有类型系统;您可以使用合理的指令来处理寄存器中的位模式

C++编译器通过使用“名称混乱”在asm中实现它,因此
foo(int,int)
的asm符号名是例如
\u Z3fooii
。()


<>强> C++中的函数重载在编译时静态解析。不涉及函数指针或任何其他运行时诡计。

它有效地使args的类型成为函数名的一部分。因此,对于手工编写的asm,等价物可以是一些简单的手动方案,如
foo_int
foo_float
foo_int_int
,等等。每个方案都有一个单独的定义,就像3个名称完全不同的单独函数一样

C++比asm支持更多的代码重用(尤其是通过模板)。您可以想象尝试在asm中使用宏执行某些操作,其中可能有一个宏arg,它是类似
int
之类的字符串。但是,除非宏仅将对其他函数的调用缝合在一起(通过将字符串固定到某个基本名称,如
调用foo\u%1
/
mov rdi、rax
/
调用条\u%1
),否则这在asm中并不真正起作用(因为每个真正起作用的指令都必须使用正确大小的寄存器)


我想对于以寄存器名称作为宏参数的宏,它可能会扩展到
添加rax、rsi
添加eax、esi
,具体取决于调用方传递的内容,并且它可以传递
long
int
进行匹配。(因此,宏就像一个模板函数,类型作为模板参数;重载只存在于使用类型名称作为asm符号名称一部分的调用中。)这当然只能在有限的情况下工作。e、 g.
float
需要不同于
int
long
的助记符,以及不同的寄存器名,在大多数ISA上。

是的,这种技术被称为“名称混乱”。不把它作为答案,因为我不确定,但我确信编译器会给每个函数重载一个唯一的名称,这样在程序集中实际上就没有任何重载函数。你可以把C++函数看作是作为名称的一部分的参数类型。例如,
foo(int a,double b)
foo\uu int\uu double
。汇编