gpt4 book ai didi

c++ - 事件是 SFML。 switch 语句 VS if 语句

转载 作者:行者123 更新时间:2023-11-30 00:47:16 28 4
gpt4 key购买 nike

我有这样的代码:

while(window.pollEvent(event) {
//checking events...
}

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

switch(event.type) {
case sf::Event::Closed:
window.close();
break;
case sf::Event::KeyPressed:
//...
break;
}

或 if-else 语句:

if(event.type == sf::Event::Closed)
window.close();
else if(event.type == sf::Event::KeyPressed)
//...

哪个在 SFML 中速度更快并且对其他人来说更具可读性?

最佳答案

这不是 SFML 的问题,其他类型的类似代码(例如大多数事件循环、有限状态自动机、bytecode 解释器;另请阅读 threaded code)可能会出现同样的问题。 ).

关于性能,原则上,switch 通常 稍微 更快,但您应该进行基准测试(一些编译器可能 optimizeif 的序列转换为等效于 switch 的序列,反之亦然)。在您的情况下,这并不重要(因为大多数时候您的应用程序会等待 window.pollEvent(event) ....)中的事件。

假设没有进行大量优化,我认为一些罕见的开关可能会稍微慢一些,因为例如L1 I-cache 已满是因为热代码太大等等......但这种情况很不寻常。

如果您好奇,请阅读此 A Superoptimizer 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 编译(你会得到 数百 的编译器转储文件,对应于各种优化通过一些优化开关(例如 -O2-O3)传入 GCC ...)。

关于c++ - 事件是 SFML。 switch 语句 VS if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35416244/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com