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

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

我什么时候应该写关键字?inline用于C+中的函数/方法?

在看到一些答案后,一些相关的问题:

  • 我什么时候该在C+中为函数/方法编写关键字“内联”?

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

  • 如果一个应用程序是多线程当一个人为一个函数/方法写“内联”时?


心有法竹
浏览 613回答 4
4回答

30秒到达战场

我想用一个令人信服的例子来解释这篇文章中所有的伟大答案,以消除任何剩余的误解。给定两个源文件,例如:inline111.cpp:#include&nbsp;<iostream>void&nbsp;bar();inline&nbsp;int&nbsp;fun()&nbsp;{ &nbsp;&nbsp;return&nbsp;111;}int&nbsp;main()&nbsp;{ &nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"inline111:&nbsp;fun()&nbsp;=&nbsp;"&nbsp;<<&nbsp;fun()&nbsp;<<&nbsp;",&nbsp;&fun&nbsp;=&nbsp;"&nbsp;<<&nbsp;(void*)&nbsp;&fun; &nbsp;&nbsp;bar();}inline222.cpp:#include&nbsp;<iostream>inline&nbsp;int&nbsp;fun()&nbsp;{ &nbsp;&nbsp;return&nbsp;222;}void&nbsp;bar()&nbsp;{ &nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"inline222:&nbsp;fun()&nbsp;=&nbsp;"&nbsp;<<&nbsp;fun()&nbsp;<<&nbsp;",&nbsp;&fun&nbsp;=&nbsp;"&nbsp;<<&nbsp;(void*)&nbsp;&fun;}案例A:编译:g++&nbsp;-std=c++11&nbsp;inline111.cpp&nbsp;inline222.cpp输出量:inline111:&nbsp;fun()&nbsp;=&nbsp;111,&nbsp;&fun&nbsp;=&nbsp;0x4029a0inline222:&nbsp;fun()&nbsp;=&nbsp;111,&nbsp;&fun&nbsp;=&nbsp;0x4029a0讨论:即使您应该对内联函数有相同的定义,如果情况并非如此,C+编译器也不会标记它(实际上,由于单独汇编它没有办法检查)。确保这一点是你自己的责任!链接器不抱怨一种定义规则,如fun()被宣布为inline..但是,因为inline111.cpp是第一个翻译单元(它实际上调用fun())由编译器处理,编译器实例化fun()在它第一打电话inline111.cpp..如果编译器决定不扩大fun()应您程序中其他任何地方的要求(G.从…inline222.cpp)的电话fun()将始终链接到其生成的实例。inline111.cpp(电话:fun()内inline222.cpp也可以在该翻译单元中生成一个实例,但它将保持不链接)。事实上,这一点从相同的&fun = 0x4029a0打印出来。最后,尽管inline对编译器的建议实际扩展一条龙fun(),它视而不见你的建议很清楚,因为fun() = 111在这两条线上。案例B:编译&nbsp;(通知反向命令):g++&nbsp;-std=c++11&nbsp;inline222.cpp&nbsp;inline111.cpp输出量:inline111:&nbsp;fun()&nbsp;=&nbsp;222,&nbsp;&fun&nbsp;=&nbsp;0x402980inline222:&nbsp;fun()&nbsp;=&nbsp;222,&nbsp;&fun&nbsp;=&nbsp;0x402980讨论:这个案例证明了案件A.注意一个重要的问题,如果您注释掉实际调用fun()在……里面inline222.cpp&nbsp;(G.注释掉cout-声明inline222.cpp完全)那么,尽管你的翻译单位的汇编顺序,fun()中的第一次调用时将被实例化。inline111.cpp的打印结果案例B如inline111: fun() = 111, &fun = 0x402980.案例C:编译&nbsp;(公告-O2):g++&nbsp;-std=c++11&nbsp;-O2&nbsp;inline222.cpp&nbsp;inline111.cpp或g++&nbsp;-std=c++11&nbsp;-O2&nbsp;inline111.cpp&nbsp;inline222.cpp输出量:inline111:&nbsp;fun()&nbsp;=&nbsp;111,&nbsp;&fun&nbsp;=&nbsp;0x402900inline222:&nbsp;fun()&nbsp;=&nbsp;222,&nbsp;&fun&nbsp;=&nbsp;0x402900讨论:原样在此描述,&nbsp;-O2优化鼓励编译器实际扩展可以内联的函数(也请注意,-fno-inline是违约没有优化选项)。从这里的输出可以看出,fun()实际上内联扩展(根据它的定义特别翻译股),产生两个异类&nbsp;fun()打印出来。尽管如此,还是有只有一个全局链接实例fun()(按照标准的要求),从完全相同&nbsp;&fun打印出来。

Qyouu

什么时候我不应该为C+中的函数/方法写关键字“内联”呢?如果函数是在.cpp档案,你应该不写关键字。编译器什么时候不知道什么时候使函数/方法‘内联’?没有这样的情况。编译器不能使函数内联。它所能做的就是内联一些或所有对函数的调用。如果它没有函数的代码,它就不能这样做(在这种情况下,链接器需要这样做,如果它能够这样做的话)。当一个应用程序为函数/方法写“内联”时,应用程序是否是多线程的?不,那根本不重要。
打开App,查看更多内容
随时随地看视频慕课网APP