Len*_*ers 253 c++ inline-functions
在C++中使用内联函数的优点/缺点是什么?我看到它只会提高编译器输出的代码的性能,但是使用今天的优化编译器,快速CPU,大容量存储器等(不像1980年那样<内存稀缺,一切都必须适合100KB内存)什么他们今天真的有优势吗?
pae*_*bal 196
return 42 ;语句.这对我来说是极端的内联.它在现实生活中很少发生,它使编译时间更长,不会使代码膨胀,并且会使代码更快.但是像圣杯一样,不要试图在任何地方应用它,因为大多数处理都无法通过这种方式解决......不过,这仍然很酷... Bri*_*ndy 142
内联函数更快,因为您不需要在堆栈上推送和弹出内容,如参数和返回地址; 但是,它确实使你的二进制文件略大.
它有显着差异吗?在大多数现代硬件上并不明显.但它可以产生影响,这对一些人来说已经足够了.
标记内联内容并不能保证它是内联的.这只是对编译器的建议.有时它不可能,例如当你有虚函数或有涉及递归时.有时编译器只选择不使用它.
我可以看到这样的情况产生了可检测的差异:
inline int aplusb_pow2(int a, int b) {
return (a + b)*(a + b) ;
}
for(int a = 0; a < 900000; ++a)
for(int b = 0; b < 900000; ++b)
aplusb_pow2(a, b);
Run Code Online (Sandbox Code Playgroud)
Emi*_*lia 42
在古老的C和C++中,inline就像register:对编译器关于可能的优化的建议(仅仅是建议).
在现代C++中,inline告诉链接器,如果在不同的转换单元中找到多个定义(不是声明),它们都是相同的,并且链接器可以自由地保留一个并丢弃所有其他转换单元.
inline 如果在头文件中定义了一个函数(无论多么复杂或"线性"),则允许多个源包含它而不会被链接器收到"多重定义"错误.
在类中定义的成员函数默认为"内联",模板函数也是如此(与全局函数相反).
//fileA.h
inline void afunc()
{ std::cout << "this is afunc" << std::endl; }
//file1.cpp
#include "fileA.h"
void acall()
{ afunc(); }
//main.cpp
#include "fileA.h"
void acall();
int main()
{
afunc();
acall();
}
//output
this is afunc
this is afunc
Run Code Online (Sandbox Code Playgroud)
请注意将fileA.h包含在两个.cpp文件中,从而产生两个.cpp文件afunc().链接器将丢弃其中一个.如果未inline指定,则链接器将抱怨.
pax*_*blo 16
内联是对编译器的建议,可以自由忽略.它适用于少量代码.
如果你的函数是内联的,它基本上插入到函数调用的代码中,而不是实际调用一个单独的函数.这可以帮助您提高速度,因为您无需进行实际通话.
它还协助CPU进行流水线操作,因为它们不必使用调用引起的新指令重新加载管道.
唯一的缺点是可能增加二进制大小,但只要功能很小,这就不会太重要了.
我现在倾向于将这些决定留给编译器(好吧,无论如何都是聪明的).编写它们的人往往对底层架构有更详细的了解.
小智 12
内联函数是编译器使用的优化技术.可以简单地将内联关键字添加到函数原型中以使函数内联.内联函数指示编译器在代码中使用该函数的任何地方插入函数的完整主体.
它不需要函数调用开销.
它还可以在函数调用时节省堆栈上变量push/pop的开销.
它还节省了函数返回调用的开销.
它通过利用指令缓存增加了引用的局部性.
内嵌编译器也可以应用程序内优化(如果指定).这是最重要的一个,这样编译器现在可以专注于死代码消除,可以给分支预测,感应变量消除等带来更多压力.
要查看有关它的更多信息,可以点击此链接 http://tajendrasengar.blogspot.com/2010/03/what-is-inline-function-in-cc.html
我想补充一点,在构建共享库时,内联函数至关重要.如果没有内联标记函数,它将以二进制形式导出到库中.如果导出,它也将出现在符号表中.另一方面,内联函数既不会导出到库二进制文件也不会导出到符号表.
当要在运行时加载库时,这可能是至关重要的.它也可能会遇到二进制兼容感知库.在这种情况下不要使用内联.