4

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

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

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

4

2 回答 2

5

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

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

有一个设置"Favor size or speed",它极大地改变了编译器准备做多少内联。

于 2012-10-04T14:51:31.617 回答
4

是什么inline

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

什么不是 inline

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

如何执行内联?

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

于 2012-10-04T14:55:12.463 回答