为什么MSVC 10.0编译器经常忽略内联关键字?

时间:2012-10-04 14:41:43

标签: c++ visual-c++ inlining

我有一些非常复杂的c ++代码,它在实时系统中使用,因此对速度非常敏感。它是在Linux上开发的,为了加快速度,很多函数都标有“inline”关键字并移入头文件以允许内联。

现在我将此代码移植到Windows(msvc 10.0,Windows 7),运行速度慢了约30%。在做了一些分析后,我发现问题基本上是很多函数没有内联。当我使用“__forceinline”时,我很容易看到加速大约10-20%。

有人对此有解释吗?仅仅是msvc中的算法更加保守吗?或者我做错了什么,比如错过配置选项?

2 个答案:

答案 0 :(得分:5)

您需要检查MSVC优化设置:

Project Properties -> C/C++ -> Optimization

有一个名为"Favor size or speed"的设置,它实质上改变了编译器准备做多少内联。

答案 1 :(得分:4)

  

什么是inline

inline是一个关键字,它向编译器发出信号,表明方法定义是内联呈现的。通常,一个方法应该只在一个TU(大致是源文件)中定义,而inline允许在头中定义一个方法,它将包含在许多不同的TU中,并避免编译器/链接器有关重复符号的投诉。链接器将适当地合并符号。

  

什么是 inline

inline绝不是编译器内联函数的命令。从历史上看,它可能已经被这样使用了,但是优化器在决定何时(而不是)内联时变得越来越好,inline“提示”现在几乎没有效果。

  

如何强制执行内联?

编译器通常提供特定的关键字/属性以要求“更多”内联。例如,在MSVC中,__forceinline将提示强烈(但仍然只是暗示)该方法应该内联。