Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 大型switch语句的实现与效率_C++_If Statement_Switch Statement - Fatal编程技术网

C++ 大型switch语句的实现与效率

C++ 大型switch语句的实现与效率,c++,if-statement,switch-statement,C++,If Statement,Switch Statement,我继承了一些代码,这些代码在许多地方都包含消息处理代码,这些代码是这样实现的: switch(msgType) { case msgType1: //.... switch(msgSubType): { case msgType2: //.... } } 有10种消息类型和100种消息子类型。这段代码经常被执行,我的问题是它的效率。这样的代码有多高效,特别是在大量情况下?sw

我继承了一些代码,这些代码在许多地方都包含消息处理代码,这些代码是这样实现的:

switch(msgType)
{
    case msgType1:
        //....
        switch(msgSubType):
        {
            case msgType2:
            //....
        }
}

有10种消息类型和100种消息子类型。这段代码经常被执行,我的问题是它的效率。这样的代码有多高效,特别是在大量情况下?switch案例是否像else语句一样实现?某种哈希表或跳转表会更好吗?我愿意牺牲代码的可读性来换取性能,并且对任何答案/建议都感兴趣。

我认为这最终会在任何体面的现代编译器下优化为跳转表。我同意@H2CO3-现代编译器应该比您做得更好。只需检查汇编代码或对这里真正发生的事情进行基准测试,以确保。我刚才在MSVC2010上做了一个测试-
开关
是O(1),我。@evgenypanasuk很棒的测试!这再次表明虚拟函数的膨胀是一个被揭穿的神话。无论编译器如何处理这段代码,都应该对其进行重构以提高可读性。每个
case
标签后面都应该跟着简单的代码,而不是另一个包含数百个case的开关。将该代码放在它自己的函数中,并根据需要从顶级switch语句调用它。@evgenypanasuk同意,但尽管如此,这个代码示例仍然需要多态性。事实上,它是脆弱的,而且是无法维护的。牺牲这么多的可读性确实需要大量的性能作为理由。