事件是SFML.切换语句VS if语句

Nat*_*iss 1 c++ if-statement switch-statement

我有一些像这样的代码:

while(window.pollEvent(event) {
    //checking events...
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我应该使用switch语句:

switch(event.type) {
    case sf::Event::Closed:
        window.close();
        break;
    case sf::Event::KeyPressed:
        //...
        break;
}
Run Code Online (Sandbox Code Playgroud)

或if-else声明:

if(event.type == sf::Event::Closed)
    window.close();
else if(event.type == sf::Event::KeyPressed)
    //...
Run Code Online (Sandbox Code Playgroud)

在SFML中哪个更快,而在其他方面更具可读性?

Bas*_*tch 5

这不是SFML的问题,同样的问题可能出现在其他类似的代码中(例如,大多数事件循环,有限状态自动机,字节码解释器;也读取有关线程代码).

至于性能,在原则上,switch经常快,但你应该基准(和一些编译器可能会优化序列if到相当于switch或反之亦然).在你的情况下,它应该不重要(因为大多数时候你的应用程序会等待window.pollEvent(event) ......中的事件).

假设没有重优化的情况,我会想象一些罕见的交换机可能会稍微慢一些,因为如L1高速缓存器的充满因为热码会过大,等等......但是,这情况是不寻常的.

如果您感到好奇,请阅读这篇关于交换机优化的A Multioptimizer Analysis of Multiway Branch Code Generation论文(由R.Sayle撰写).

关于可读性,switch它也更具可读性.

可读性的说法似乎是最相关的给我; 将微优化留给编译器,它们做得很好.当然,不要忘了编译g++ -Wall -O2 -mcpu=native,也许替代-O2-O3(甚至是编译和链接g++ -flto -O3 -mcpu=native,如果你很在意性能)

(实际上,在这种情况下,可读性是唯一对您而言重要的事情)

如果您想了解编译器优化的方式和"原因",请考虑添加到您的-O2标志 -fverbose-asm -S(然后查看生成的.s文件)或甚至编译-fdump-tree-all(您将获得数百个编译器转储文件,对应于GCC中的各种优化传递. ..)带有一些优化开关(例如-O2-O3).