![]() |
1
2
对。
例如,来自MSDN:
但请注意:
TU基本上是一组头文件加上一个实现文件(
当然。为什么不帮助编译器帮助你生成更少的代码呢?通常情况下,如果prolog/epilog部分比内联部分花费更多的成本,那么编译器会强制生成它们吗?但你必须, 绝对必须 在开始内联之前,请阅读这篇GOTW文章: GotW #33: Inline
同样,正如我所说,作为一个好的程序员,你应该在可能的时候帮助编译器。但是
here's
C++常见问题解答
|
![]() |
2
6
重申我在那些小评论框里说的话。特别是,我从来没说过英林- :
现在,TU1和TU2都有自己的
. |
![]() |
3
3
对。但是如果函数有多个定义,链接器就需要它(见下文) 在头文件中定义的函数上(通常)需要它。将它添加到小函数中并没有什么坏处(但我不介意)。注意:在类声明中定义的类成员是自动内联声明的。
如果使用正确,它将停止链接器错误。
否。编译器会对内联每个函数调用进行成本/收益比较,并做出适当的选择。因此,对一个函数的调用可能在某些情况下是内联的,而不是在其他情况下内联的(取决于编译器算法的工作方式)。
多重定义:
文件:主.cpp
这里我们有两个add()的定义。一个在main.o,一个在test.o |
![]() |
4
2
|
![]() |
5
2
|
![]() |
6
1
关于这一点:
至于其他方面:
|
![]() |
7
1
|
![]() |
8
1
in-lining的另一个好处(注意,实际的内联有时与“inline”指令的使用正交)发生在函数使用引用参数时。将两个变量传递给一个非内联函数以将其第一个操作数与第二个操作数相加,需要先推送第一个操作数的值和第二个操作数的地址,然后调用一个函数,该函数必须弹出第一个操作数和第二个操作数的地址,然后将前一个值间接地添加到弹出的地址。如果函数是内联展开的,编译器可以简单地将一个变量直接添加到另一个变量中。 |
![]() |
9
0
它是通过粘贴函数代码来减少一级间接寻址。 |