问题描述
例如,假设我们有一个函数用 int
替换 0
的两个最低有效小数位:
int Remove2LSD(int x)
{
return x / 100 * 100;
}
如果我们通过 2052
,我们应该期望返回 2000
,2199
应该返回 2100
。
如果您在有或没有优化的情况下运行 MSVC 编译器,它似乎不会发生常量折叠,这正是我所期望的,因为 x / 100
应该在 * 100
之前进行评估,并且我们'在编译时不评估 x / 100
。参数 x
来自运行时输入。
根据我的假设和测试,我认为我不必担心不断折叠将 return x / 100 * 100;
更改为 return x;
;但是,我希望找到关于这种情况下预期行为的更好文档,而不是仅仅依赖于我的假设和测试。
是否有关于此行为的良好文档?我查看了 SO 和网络上的其他地方,但找不到对我有用的文档。
解决方法
大多数优化(包括常量折叠)都由 as-if rule 控制。它声明允许任何优化当且仅当它不会改变程序的可观察行为(它“就像”它没有被优化一样工作)。
所以不,你不必担心这里的不断折叠。