我知道你可以使用inline关键字或只是把一个方法在类声明翼短构造函数或getter方法,但是编译器就当内联我的方法最终结果呢?
例如:
inline void Foo::vLongBar()
{
//several function calls and lines of code
}
编译器会忽略我的inline声明,如果它认为它会让我的代码效率低下?
作为一个方面的问题,如果我有一个getter方法我的课这样的外部声明:
void Foo::bar() { std::cout << "baz"; }
编译器将内联这个在幕后?
无论是否fiunction是内联是,在这一天结束,完全由编译器。 典型地,该更复杂的功能是在流动方面,就越有可能编译器是内联的。 还有一些功能,如递归的,根本无法被内联。
不内联函数的主要原因是,它会大大增加代码的整体尺寸,IOT防止在处理器的缓存举行。 这实际上是一个pessimisation,而不是优化。
至于让程序员决定拍摄自己的脚,或其他地方,你可以自己内联函数 - 写将在什么将是这个函数的调用点已经走在了函数的代码。
是的,无论是否内联代码的最终决定在于C ++编译器。 inline关键字是一个建议,不是必须的。
这里有一些细节,这一决定是如何在Microsoft C ++编译器处理
- http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx
正如许多人已经发布,最终决定权始终是编译器,即使你可以给公司的提示,如forceinline。
一部分理由是,内联不是一个自动的“走得快”开关。 过多的内联可以使你的代码要大得多,并且可以与其他优化干扰。 见的C ++ FAQ精简版约内嵌的功能和性能 。
正如其他人所指出的那样, inline
关键字仅仅是一个建议,编译器内联的代码。 由于编译器将定期内联代码尚未标有inline
,并且具有不内联代码,关键字似乎正如冗余register
或(预先的C ++ 0x) auto
。
然而,就是一件事inline
关键字的效果:它改变了功能的外部 联动 (默认为函数) 内联 。 内嵌链接允许每个编译单元包含它的目标代码的自己的副本,并具有连接从最终的可执行文件中删除的冗余副本。 如果提醒你的模板,是的,模板也使用内嵌链接。
是的,编译器有最终决定权。 在VS,你甚至可以内嵌递归函数到指定深度 ;)
#pragma inline_depth( [0... 255] )
我想补充我5分钱......
我发现这周的大师文章关于内联非常有用的。
至于我记得我读的地方,甚至一个链接可以做内联,当它链接的目标文件,发现被链接的代码可以被内联。
问候,
Ovanes
作为一个方面的问题,如果我有一个getter方法我的课这样的外部声明:
void Foo::bar() { std::cout << "baz"; }
编译器将内联这个在幕后?
这取决于。 它可以在同一个翻译单元(所有呼叫者.cpp
文件及其所有包含(#include)定义)。 但它仍然有编译非内嵌版本,因为有可能是翻译单元之外的功能的调用者。 您可以潜在地看到这个工作(如果你的编译器实际上可以做到这一点),在高优化级别。 (特别是:。比较,当你#包括所有的cpp文件中一个的.cpp与典型的布局与一个翻译单元大幅这种内联更多机会的所有定义会发生什么)
按我的知识,编译器会自动让你声明为inline(或类声明中写道)函数非-inline如果发现像一个循环,而等,这是一个例子,其中编译器有内联函数的最后发言权。
如果你真的肯定,绝对没有失败NEED内联代码,总有宏。 C已支持了这些多年,因为他们只是文本替换编译之前,他们真的,真的,内联不管你写的。
这就是为什么“内联”关键字(甚至在某些情况下,强行变型)能够承受没有迫使它的标准方法 - 你总是可以只写一个宏。
这就是说,inline关键字往往是更好的,因为编译器常常知道,如果制作内联函数是有道理,还是没有,因为内联可以用编译器优化的互动。