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

何时应该为函数/方法编写关键字“内联”?

何时应该为函数/方法编写关键字“内联”?

C++ C
心有法竹 2019-06-03 16:50:14
何时应该为函数/方法编写关键字“内联”?我什么时候应该写关键字?inline用于C+中的函数/方法?在看到一些答案后,一些相关的问题:我什么时候该不在C+中为函数/方法编写关键字“内联”?编译器什么时候不知道什么时候使函数/方法‘内联’?如果一个应用程序是多线程当一个人为一个函数/方法写“内联”时?
查看完整描述

4 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

我想用一个令人信服的例子来解释这篇文章中所有的伟大答案,以消除任何剩余的误解。

给定两个源文件,例如:

  • inline111.cpp:

    #include <iostream>void bar();inline int fun() {
      return 111;}int main() {
      std::cout << "inline111: fun() = " << fun() << ", &fun = " << (void*) &fun;
      bar();}
  • inline222.cpp:

    #include <iostream>inline int fun() {
      return 222;}void bar() {
      std::cout << "inline222: fun() = " << fun() << ", &fun = " << (void*) &fun;}

  • 案例A:

    编译:

    g++ -std=c++11 inline111.cpp inline222.cpp

    输出量:

    inline111: fun() = 111, &fun = 0x4029a0inline222: fun() = 111, &fun = 0x4029a0

    讨论:

    1. 即使您应该对内联函数有相同的定义,如果情况并非如此,C+编译器也不会标记它(实际上,由于单独汇编它没有办法检查)。确保这一点是你自己的责任!

    2. 链接器不抱怨一种定义规则,如fun()被宣布为inline..但是,因为inline111.cpp是第一个翻译单元(它实际上调用fun())由编译器处理,编译器实例化fun()在它第一打电话inline111.cpp..如果编译器决定扩大fun()应您程序中其他任何地方的要求(G.从…inline222.cpp)的电话fun()将始终链接到其生成的实例。inline111.cpp(电话:fun()inline222.cpp也可以在该翻译单元中生成一个实例,但它将保持不链接)。事实上,这一点从相同的&fun = 0x4029a0打印出来。

    3. 最后,尽管inline对编译器的建议实际扩展一条龙fun(),它视而不见你的建议很清楚,因为fun() = 111在这两条线上。


  • 案例B:

    编译 (通知反向命令):

    g++ -std=c++11 inline222.cpp inline111.cpp

    输出量:

    inline111: fun() = 222, &fun = 0x402980inline222: fun() = 222, &fun = 0x402980

    讨论:

    1. 这个案例证明了案件A.

    2. 注意一个重要的问题,如果您注释掉实际调用fun()在……里面inline222.cpp (G.注释掉cout-声明inline222.cpp完全)那么,尽管你的翻译单位的汇编顺序,fun()中的第一次调用时将被实例化。inline111.cpp的打印结果案例Binline111: fun() = 111, &fun = 0x402980.


  • 案例C:

    编译 (公告-O2):

    g++ -std=c++11 -O2 inline222.cpp inline111.cpp

    g++ -std=c++11 -O2 inline111.cpp inline222.cpp

    输出量:

    inline111: fun() = 111, &fun = 0x402900inline222: fun() = 222, &fun = 0x402900

    讨论:

    1. 原样

      在此描述-O2

      优化鼓励编译器

      实际扩展

      可以内联的函数(也请注意,

      -fno-inline

      违约

      没有优化选项)。从这里的输出可以看出,

      fun()

      实际上

      内联扩展

      (根据它的定义

      特别

      翻译股),产生两个

      异类 fun()

      打印出来。尽管如此,还是有

      只有一个

      全局链接实例

      fun()

      (按照标准的要求),从

      完全相同 &fun

      打印出来。


查看完整回答
反对 回复 2019-06-03
?
Qyouu

TA贡献1786条经验 获得超11个赞

什么时候我不应该为C+中的函数/方法写关键字“内联”呢?

如果函数是在.cpp档案,你应该写关键字。

编译器什么时候不知道什么时候使函数/方法‘内联’?

没有这样的情况。编译器不能使函数内联。它所能做的就是内联一些或所有对函数的调用。如果它没有函数的代码,它就不能这样做(在这种情况下,链接器需要这样做,如果它能够这样做的话)。

当一个应用程序为函数/方法写“内联”时,应用程序是否是多线程的?

不,那根本不重要。


查看完整回答
反对 回复 2019-06-03
  • 4 回答
  • 0 关注
  • 612 浏览

添加回答

举报

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