为了账号安全,请及时绑定邮箱和手机立即绑定

C+中内联函数的优点?

C+中内联函数的优点?

C++
jeck猫 2019-06-25 16:22:07
C+中内联函数的优点?在C+中使用内联函数的优缺点是什么?我看到它只会提高编译器输出的代码的性能,但是对于今天的优化编译器、快速CPU、巨大内存等等(不像1980年那样-内存稀缺,所有东西都必须装在100 KB内存中)-它们今天到底有什么优势?
查看完整描述

3 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

内联函数的速度更快,因为您不需要像参数和返回地址那样在堆栈上或从堆栈中推送和弹出内容;但是,它确实会使二进制文件稍微大一些。

这会有很大的不同吗?对于大多数人来说,在现代硬件上还不够明显。但这会带来一些不同,这对一些人来说已经足够了。

在内线上做标记并不能保证它是内联的。这只是对编译器的建议。有时,这是不可能的,例如,当您有一个虚拟函数,或当有递归涉及。有时编译器只是选择不使用它。

我可以看到这样的情况会产生明显的不同:

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);


查看完整回答
反对 回复 2019-06-25
?
隔江千里

TA贡献1906条经验 获得超10个赞

在古C和C+中,inline就像register向编译器提出关于可能的优化的建议(不过是建议)。

在现代C+中,inline告诉链接器,如果在不同的翻译单元中找到多个定义(而不是声明),它们都是相同的,链接器可以自由地保留其中一个,并丢弃所有其他的定义。

inline如果在头文件中定义了一个函数(无论函数有多复杂或“线性”),则必须允许多个源包含它,而不需要链接器获得“多个定义”错误。

默认情况下,类中定义的成员函数是“内联”函数,模板函数也是(与全局函数相反)。

//fileA.hinline 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();}//outputthis is afuncthis is afunc

注意,在两个.cpp文件中包含了fileA.h,从而导致了afunc()..链接器会丢弃其中一个。如果没有inline如果指定了链接器,则链接程序将发出投诉。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 948 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信