为什么MSVC 10.0编译器经常忽略inline关键字
Why does the MSVC 10.0 compiler often ignores the inline keyword?
我有一些非常复杂的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
将强烈提示(但仍然只是提示)该方法应该内联。
相关文章:
- 激励'inline'说明符的真实世界示例?
- C++中的"inline"关键字
- 在fstream期间忽略空行
- 概念TS检查忽略私有访问修饰符
- C++宏忽略之后的内容
- 不知道某个东西是否被忽略会引入未定义的行为吗
- clang整洁10忽略了我的NOLINT命令
- If语句在c++中被忽略
- 错误:在为指针赋值时,void值没有被忽略
- 为什么stream::忽略未按预期工作
- Craps游戏问题,忽略if语句
- c++字符串中的字符将被忽略
- 为什么在 x64 中忽略__stdcall调用约定?
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- MSVC 忽略 [[maybe_unused]] 的功能?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何忽略函数模板中的恒常性?
- 为什么MSVC 10.0编译器经常忽略inline关键字
- 返回值的初始化应忽略自动对象的恒常性