Qt信号和槽的效率

3
我正在浏览QMainWindow内的方法,注意到某些部分(如resizeEvent和winEvent)不是作为信号实现的,而是必须继承该类才能重写它们。
我的问题是,信号和槽有多有效率,是否可能将这些类型的函数实现为其他类可以订阅的信号。例如,在高性能游戏引擎中。
3个回答

5
据我所知,Trolltech曾经表示,一个信号/槽调用比一个virtual调用慢大约10倍。你应该能够轻松处理数万个信号,甚至可能是数十万个每秒。

信号/槽也会生成元数据,因此它占用了类实例更多的内存,而不是虚拟方法。当调用信号时(是的,信号只是一种普通方法),它会通过连接的对象,并在接收器的元对象上使用“invoke”方法。这要比直接调用虚拟方法慢。 - Kamil Klimek
那么我们可以说使用信号和槽没有对实时性产生任何严重影响吗?有没有任何理由不能保证信号和槽在特定时间内完成? - ArmadilloChubbz65
@ArmadilloChubbz65:这还是C++。将一个一千兆字节的字符串按值传递,那份拷贝会花费很长时间。 - MSalters

3

信号和槽的设计是为了让不同的对象之间进行通信,这些对象都在您的控制之下。

您提到的事件只涉及一个对象,该对象直接由事件循环通知。这里不需要使用信号或槽。

请注意,如果需要,您可以在事件成员函数中发出信号。这通常是对事件做出反应的正确方式。这样,其他对象就可以订阅某些内容。


0
继承自QMainWindow,重新实现resize()和emit()信号,如果你想在其他地方对这些信号做出反应。

或者只需创建并安装事件过滤器。 - San Jacinto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接