【发布时间】:2019-04-11 09:40:15
【问题描述】:
假设我有 N 个在编译时已知的不同整数值,从 V_1 到 V_N。考虑以下结构:
const int x = foo();
switch(x) {
case V_1: { /* commands for V_1 which don't change x */ } break;
case V_2: { /* commands for V_1 which don't change x */ } break;
/* ... */
case V_N: { /* commands for V_1 which don't change x */ } break;
}
对比
const int x = foo();
if (x == V_1) { /* commands for V_1 which don't change x */ }
else if (x == V_2) { /* commands for V_2 which don't change x */ }
else ...
else if (x == V_N) { /* commands for V_N which don't change x */ }
现代 C++ 编译器是否以不同的方式处理这些?也就是说,他们是否对这些代码结构应用了不同的潜在优化?还是他们将它们“规范化”为相同的,然后决定优化(例如是否形成跳转表)?
注意事项:
- 我所说的现代 C++ 编译器主要指的是最新版本的 GCC、clang 和 MSVC。 ICC 也可能是相关的。
- 请回答关于最大优化级别(
-O3用于 clang 和 GCC) - ...但是,如果
switches 和if-then-else-chains 的处理在某些优化级别相同而在其他优化级别不同,那也很有趣。 - 我猜答案可能取决于
N的值 - 如果可能,请给出阈值。
【问题讨论】:
-
在 godbolt.org 上尝试通常是解决这类问题的良好第一步。
-
@FrançoisAndrieux:结果可能相同,但这可能是由于 N 选择不当,或者由于不同的优化导致相同的结果。
标签: c++ switch-statement g++ compiler-optimization clang++