我正在使用C ++项目。当我在Visual Studio Community 2017中构建项目时,Visual Studio C ++项目生成“1个函数已重新评估内联决策,但保持不变”。
那么,“1个函数是什么意思重新评估了内联决策,但保持不变”?
visual studio Community 2017是否会编辑我的更改?
答案 0 :(得分:2)
传统上,更改后要构建的文件的决定是基于每个.cpp
文件及其#include
d依赖项的时间戳。如果您触摸了项目中每个人都包含的.h
(即使只是添加评论),所有文件都会重建。
VC ++的最新版本具有Minimal Rebuild功能,该功能的粒度较小:依赖.cpp文件中的每个功能都会被重新检查,如果是AST级别的话对编译器的输入没有改变,在该函数的先前编译中生成的代码被回收(参见this answer)。
现在,我在这里推测一下,可能会发生上一次运行中生成的代码合法正常,但有关内联启发式输入的内容已发生变化。
例如,假设有一些帮助函数foo
从上一次编译中收缩了很多,并且它有资格进行内联:为所有调用{{1}的函数生成的代码(它称之为"常规"函数,没有内联)实际上可以合法地回收,并且生成的可执行文件将运行正常,尽管编译器,如果从头开始构建所有内容,现在可能内联{ {1}}以获得更好的效果。
启用了最小重建功能后,编译器将最小重建时间限制在可执行文件的最佳性能上(并向您发出警告)。
因此,在常规" compile-link-run-debug"期间,该消息通常无需担心。循环 - 如果您没有专门调查性能问题,只需享受缩短的编译时间。
OTOH,如果你需要做一个"清洁"或者非常好的性能版本,要么禁用最小重建选项,要么只是从头开始清理构建和重建;最小重建不会启动(因为先前编译中的文件将被删除),并且您将从生成的可执行文件中获得最佳性能。
答案 1 :(得分:1)
编译器可能会或可能不会inline a function取决于各种因素,例如性能权衡,编译模式(例如发布与调试)等。这条消息只是编译器冗长而且说, “嘿,我考虑过是否内联1函数,但是保持原样。”
虽然消息没有明确说明它已经编译了什么,但是它重新评估这样一个决定的唯一原因是由于强制重新编译,更改编译设置,或者最常见的是对源代码的更改。
答案 2 :(得分:1)
您可以使用关键字inline
声明一个函数,编译器用函数本身替换属于该函数的函数调用,以减少执行时间。但是,如果函数太大,编译器可以忽略inline关键字,在这种情况下,执行时间会增加。此外,即使您没有将其声明为内联,编译器也可以内联函数,如果它更有效。最后,编译器决定保留或删除此关键字。在您的情况下,Visual Studio重新评估函数以查看其决策是否应该更改。请参阅here以便更好地理解。