0

例如,假设我们有一个函数用 替换 a 的两个最低有效小数int0

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 和其他地方,但找不到对我有用的文档。

4

1 回答 1

3

大多数优化(包括常量折叠)都由as-if 规则控制。它指出当且仅当它不改变程序的可观察行为时才允许任何优化(它“就像”它未优化一样工作)。

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

于 2021-04-22T18:44:32.403 回答