首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“默认”开关会影响跳转表的优化吗?

“默认”开关会影响跳转表的优化吗?
EN

Stack Overflow用户
提问于 2010-11-25 23:54:22
回答 7查看 2K关注 0票数 11

在我的代码中,我习惯于编写包含如下断言的备用默认用例,以防止我忘记在case语义发生变化时更新开关

代码语言:javascript
复制
switch(mode) {
case ModeA: ... ;
case ModeB: ... ;
case .. /* many of them ... */
default: {
  assert(0 && "Unknown mode!");
  return ADummyValue();
}
};

现在我想知道人工回退检查默认情况是否会干扰跳表生成?假设"ModeA“和"ModeB”等是连续的,这样编译器就可以优化成一个表。由于“默认”情况包含实际的“返回”语句(因为断言将在发布模式下消失,编译器将抱怨缺少返回语句),因此编译器似乎不太可能优化缺省分支。

处理这个问题的最好方法是什么?一些朋友建议我将"ADummyValue“替换为空指针引用,这样在出现未定义的行为时,编译器就可以省略对缺少返回语句的警告。有没有更好的方法来解决这个问题?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-11-26 00:12:36

如果你的编译器是MSVC,你可以使用__assumehttp://msdn.microsoft.com/en-us/library/1b3fsfxw(v=VS.80).aspx

票数 3
EN

Stack Overflow用户

发布于 2010-11-26 00:07:53

至少在我看过的编译器中,答案通常是否定的。它们中的大多数都会将这样的switch语句编译成大致相当于以下内容的代码:

代码语言:javascript
复制
if (mode < modeA || mode > modeLast) {
    assert(0 && "Unknown mode!");
    return ADummyValue();
}
switch(mode) { 
    case modeA: ...;
    case modeB: ...;
    case modeC: ...;
    // ...
    case modeLast: ...;
}
票数 3
EN

Stack Overflow用户

发布于 2010-11-26 01:19:49

如果您使用的是"default“(哈!) <assert.h>,那么该定义无论如何都与NDEBUG宏绑定在一起,所以可能只需要

代码语言:javascript
复制
    case nevermind:
#if !defined(NDEBUG)
    default:
        assert("can" && !"happen");
#endif
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4278807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档