整数表达式的 C++ 常量折叠的预期行为是什么?

问题描述

例如,假设我们有一个函数用 int 替换 0 的两个最低有效小数位:

int Remove2LSD(int x)
{
  return x / 100 * 100;
}

如果我们通过 2052,我们应该期望返回 20002199 应该返回 2100

如果您在有或没有优化的情况下运行 MSVC 编译器,它似乎不会发生常量折叠,这正是我所期望的,因为 x / 100 应该在 * 100 之前进行评估,并且我们'在编译时不评估 x / 100。参数 x 来自运行时输入。

根据我的假设和测试,我认为我不必担心不断折叠将 return x / 100 * 100; 更改为 return x; ;但是,我希望找到关于这种情况下预期行为的更好文档,而不是仅仅依赖于我的假设和测试。

是否有关于此行为的良好文档?我查看了 SO 和网络上的其他地方,但找不到对我有用的文档。

解决方法

大多数优化(包括常量折叠)都由 as-if rule 控制。它声明允许任何优化当且仅当它不会改变程序的可观察行为(它“就像”它没有被优化一样工作)。

所以不,你不必担心这里的不断折叠。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...