在我的代码中,我习惯于编写包含如下断言的备用默认用例,以防止我忘记在case语义发生变化时更新开关
switch(mode) {
case ModeA: ... ;
case ModeB: ... ;
case .. /* many of them ... */
default: {
assert(0 && "Unknown mode!");
return ADummyValue();
}
};现在我想知道人工回退检查默认情况是否会干扰跳表生成?假设"ModeA“和"ModeB”等是连续的,这样编译器就可以优化成一个表。由于“默认”情况包含实际的“返回”语句(因为断言将在发布模式下消失,编译器将抱怨缺少返回语句),因此编译器似乎不太可能优化缺省分支。
处理这个问题的最好方法是什么?一些朋友建议我将"ADummyValue“替换为空指针引用,这样在出现未定义的行为时,编译器就可以省略对缺少返回语句的警告。有没有更好的方法来解决这个问题?
发布于 2010-11-26 00:12:36
如果你的编译器是MSVC,你可以使用__assume:http://msdn.microsoft.com/en-us/library/1b3fsfxw(v=VS.80).aspx
发布于 2010-11-26 00:07:53
至少在我看过的编译器中,答案通常是否定的。它们中的大多数都会将这样的switch语句编译成大致相当于以下内容的代码:
if (mode < modeA || mode > modeLast) {
assert(0 && "Unknown mode!");
return ADummyValue();
}
switch(mode) {
case modeA: ...;
case modeB: ...;
case modeC: ...;
// ...
case modeLast: ...;
}发布于 2010-11-26 01:19:49
如果您使用的是"default“(哈!) <assert.h>,那么该定义无论如何都与NDEBUG宏绑定在一起,所以可能只需要
case nevermind:
#if !defined(NDEBUG)
default:
assert("can" && !"happen");
#endif
}https://stackoverflow.com/questions/4278807
复制相似问题