为什么MSVC 10.0编译器经常忽略inline关键字

Why does the MSVC 10.0 compiler often ignores the inline keyword?

本文关键字:常忽略 inline 关键字 编译器 MSVC 为什么      更新时间:2023-10-16

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

现在我把这段代码移植到了Windows(msvc10.0,Windows7)上,它的运行速度慢了30%。在做了一些分析之后,我发现问题基本上是很多函数没有内联。当我使用"__forceinline"代替时,我很容易看到大约10-20%的加速。

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

您需要检查您的MSVC优化设置:

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

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

什么是inline

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

什么是而不是inline

inline决不是编译器内联函数的顺序。从历史上看,它可能是这样使用的,但优化器在决定何时(和不)内联方面变得越来越好,而inline"提示"现在几乎没有效果。

如何强制内联?

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