整数表达式的 C++ 常量折叠的预期行为是什么?
What is the expected behavior of C++ constant folding of integer expressions?
例如,假设我们有一个函数将 int
的两个最低有效小数位替换为 0
:
int Remove2LSD(int x)
{
return x / 100 * 100;
}
如果我们通过 2052
,我们应该期待 2000
的 return,2199
应该 return 2100
.
如果你 运行 它有或没有优化,似乎 MSVC 编译器不会发生常量折叠,这是我所期望的,因为 x / 100
应该在 [=18] 之前评估=],并且我们不会在编译时计算 x / 100
。参数 x
来自 运行 时间输入。
根据我的假设和测试,我认为我不必担心不断将 return x / 100 * 100;
更改为 return x;
;但是,我希望找到关于这种情况下预期行为的更好文档,而不是仅仅依赖于我的假设和测试。
关于这种行为有什么好的文档吗?我查看了 SO 和网络上的其他地方,但未能找到对我有用的文档。
大多数优化(包括常量折叠)都由 as-if rule 控制。它声明允许任何优化 当且仅当 它不会改变程序的可观察行为(它“就像”未优化一样)。
所以不,你不需要担心这里的不断折叠。
例如,假设我们有一个函数将 int
的两个最低有效小数位替换为 0
:
int Remove2LSD(int x)
{
return x / 100 * 100;
}
如果我们通过 2052
,我们应该期待 2000
的 return,2199
应该 return 2100
.
如果你 运行 它有或没有优化,似乎 MSVC 编译器不会发生常量折叠,这是我所期望的,因为 x / 100
应该在 [=18] 之前评估=],并且我们不会在编译时计算 x / 100
。参数 x
来自 运行 时间输入。
根据我的假设和测试,我认为我不必担心不断将 return x / 100 * 100;
更改为 return x;
;但是,我希望找到关于这种情况下预期行为的更好文档,而不是仅仅依赖于我的假设和测试。
关于这种行为有什么好的文档吗?我查看了 SO 和网络上的其他地方,但未能找到对我有用的文档。
大多数优化(包括常量折叠)都由 as-if rule 控制。它声明允许任何优化 当且仅当 它不会改变程序的可观察行为(它“就像”未优化一样)。
所以不,你不需要担心这里的不断折叠。