C++中内联函数何时被编译器禁止?

C++当中定义内联函数,可以让编译器将对内联函数的调用直接展开。


这就多少有点像宏定义了,而且没有宏定义的缺点(预处理替换,无法当成变量链接到符号表、调用有可能导致参数异常被改、等等)。


使用内联函数可以避免函数调用的开销(栈开辟、返回地址设定、栈展开),在一定的程度上可以提高程序的性能。但是这种提高是有代价的。

编译器将函数展开,会直接导致可执行程序变大。(导致运行缺页、cache命中率降低 effective c++ page 135)


编译器在某些情况下会禁止inline:


1:编译器禁止虚函数inline


      inline展开是在编译时进行的(宏定义是在预处理时展开的),而虚函数是在运行时决定调用哪个函数的。因此编译器对虚函数的inline无能为力

     (g++下试验过,编译器连警告都没有一个)


2:带有循环或者递归的调用

    

      如何inline函数过于复杂,复杂到函数本身执行的成本,比函数调用(栈开销)成本还要高,编译器禁止inline


3: 通过函数指针调用inline函数


      虽然编译器会展开inline函数,但是还是会为内联函数生成函数本体。通过函数指针,使得其等于内联函数,通过函数指针调用,无法 inline


     inline void f() {...}

    void (*p)()=f;

     p();   //此处无法内联

    

   

C联函数是一种与类一起使用的功能。如果一个函数被声明为内联的,编译器会将该函数的代码副本放入每个调用该函数的地方。这样可以减少函数调用的开销,提高程序的执行效率。通过指示编译器将函数定义为内联函数,可以替代函数的调用,从而在编译时进行代码替换,而不是在运行时引用函数定义。内联函数的主要优势在于它可以减少函数的调用开销,因为函数调用涉及到堆栈操作,而内联函数直接展开在调用的地方,避免了函数调用的开销,从而提高程序的执行效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ 实验1 重载函数和内联函数的应用 ](https://download.csdn.net/download/weixin_52516491/88014519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C++内联成员函数和内联函数](https://blog.csdn.net/wenchm/article/details/130764637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [c++内联函数](https://blog.csdn.net/travel_dream/article/details/125921537)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值