QT使用规范化签名有什么好处

What benefits does QT get with normalized signature

本文关键字:什么 规范化 QT      更新时间:2023-10-16

我读到QT对信号/插槽机制应用签名规范化过程。MOC生成器基本上从信号/插槽中删除常量引用限定符,并按值传递它们。

我有一个类,它经常生成一个名为big_data的大数据结构,而其他一些类每次发出数据结构时都需要捕获它。

struct BIG_DATA
{
    // very big data
};
class DataGenerator
{
    // some methods which generate BIG_DATA
   signals:
      void data_updated(const BIG_DATA &);
};

我的工作:

connect(&data_generator_object, SIGNAL(data_updated(const BIG_DATA &)), this, SLOT(catch_new_data(const BIG_DATA &)));

QT的作用:

connect(&data_generator_object, SIGNAL(data_updated(BIG_DATA)), this, SLOT(catch_new_data(BIG_DATA)));

那么,在这里删除const引用限定符有什么好处呢?我将如何处理将整个BIG_DATA复制到DATA_updated信号的许多客户端的开销?

如果QT也不尝试删除指针签名,那么最好的方法似乎是使用指向生成的BIG_DATA对象的指针。

签名规范化仅用于识别信号和槽。也就是说,如果您想告诉connect()要使用哪个信号或插槽,则需要在那里传递规范化签名。但是,您的信号和插槽的签名仍然没有受到影响。如果使用直接连接(这是单线程程序的默认连接),则不会复制对象。

如果使用排队连接,则无论如何都会复制您的结构(请参阅此部分)。

现在,如果您使用规范化信号,那么当您使用connect时,您可以最大限度地降低性能打击(请参阅此):

首先尝试按原样查找签名,只有在失败时才调用QMetaObject::normalizedSignature()。

这意味着,当使用非标准化的信号/槽签名时,您不仅要为strcpy()付费,还要为注定要失败的第一次查找尝试付费。当然,连接通常是在启动期间完成的,探查器不会向您显示,但使用非规范化签名会导致过早的悲观情绪。

但是,只有在使用connect时,性能才会受到影响,而不是在发送信号时。连接通常只进行一次。所以我不会太担心。

为了避免结构复制,请使用引用。