我有一些非常复杂的c ++代码,它在实时系统中使用,因此对速度非常敏感。它是在Linux上开发的,为了加快速度,很多函数都标有“inline”关键字并移入头文件以允许内联。
现在我将此代码移植到Windows(msvc 10.0,Windows 7),运行速度慢了约30%。在做了一些分析后,我发现问题基本上是很多函数没有内联。当我使用“__forceinline”时,我很容易看到加速大约10-20%。
有人对此有解释吗?仅仅是msvc中的算法更加保守吗?或者我做错了什么,比如错过配置选项?
答案 0 :(得分:5)
您需要检查MSVC优化设置:
Project Properties -> C/C++ -> Optimization
有一个名为"Favor size or speed"
的设置,它实质上改变了编译器准备做多少内联。
答案 1 :(得分:4)
什么是
inline
?
inline
是一个关键字,它向编译器发出信号,表明方法定义是内联呈现的。通常,一个方法应该只在一个TU(大致是源文件)中定义,而inline
允许在头中定义一个方法,它将包含在许多不同的TU中,并避免编译器/链接器有关重复符号的投诉。链接器将适当地合并符号。
什么是不
inline
?
inline
绝不是编译器内联函数的命令。从历史上看,它可能已经被这样使用了,但是优化器在决定何时(而不是)内联时变得越来越好,inline
“提示”现在几乎没有效果。
如何强制执行内联?
编译器通常提供特定的关键字/属性以要求“更多”内联。例如,在MSVC中,__forceinline
将提示强烈(但仍然只是暗示)该方法应该内联。