使用Qt对信号/插槽进行最佳优化

时间:2016-01-17 15:34:49

标签: c++ qt

如果我采取这样的两个对象:

$(document).ready(function() { var click = false; for (var loop = 0; loop < 10; loop++) { var rotatorInterval = setInterval(function() { if (click == false || click == undefined) { loop++; if (loop === 10) { loop = 0; } animateDiv(loop); } else { clearInterval(rotatorInterval); } }, 2500); } }); function animateDiv(loop) { if (loop % 2 != 0) { $("#x").animate({ left: "0", width: '100%' }, 1250); } else { $("#x").animate({ right: "0", width: "0" }, 1250); } }

firstobject.h:

public slots: void h_doSomething(int someint, std::vector<int> somevector, bool somebool); //(int)vector.size(): 80;

firstobject.cpp:

void firstobject::h_doSomething(int someint, std::vector<int> somevector, bool somebool) { emit anotherSignal(someint+4, somebool, somevector); }

secondobject.h:

public signals: void doSomething(int someint, std::vector<int> somevector, bool somebool); //(int)vector.size(): 80; private: std::vector< int > m_somevector;

secondobject.cpp:

这些信号和插槽是否连接,这些插槽和信号的最佳优化是什么?

对于插槽,我猜它会是:

void secondobject::basicFunction()
{
    emit doSomething(51, m_somevector, true);
}

但对于我不知道的信号,我认为矢量需要被复制,因为它是受保护的变量。

1 个答案:

答案 0 :(得分:0)

我总是说const引用传递复杂对象,除非你有充分的理由不这样做。对于intbool这样的原始类型,通常最好按原样传递它们。

您需要了解的是信号和插槽都只是功能。信号有点特殊,因为你自己没有实现它,MOC就是这样做的。但它仍然只是一个功能!通过使用const,您可以避免不必要的复制,这对于共享类来说是一件好事,但在复制需要大量资源时尤其如此,例如vector

一个重要的事情是信号槽连接有两种形式:直接连接和排队连接。对于直接连接信号,基本上直接调用所有连接的插槽,所以当你这样做时

emit doSomething(51, m_somevector, true);

它只调用连接的插槽并将参数传递给它们。

对于排队连接,Qt会复制参数,对它们进行排队,然后在另一个线程中调用这些插槽。即使您声明传递引用,也会生成副本,因此仍然可以正常工作。

这确实没有理由按值传递复杂对象,除非在调用正在进行时存在对象发生某些事情的风险。例如,可能是某些槽在向量上迭代,并且在迭代期间调用一些修改向量的方法。这可能会破坏迭代过程。但即使这样,您也可以在该方法内迭代一个副本,并仍然根据您的需要通过引用传递参数。或者只是重新设计整个事物以避免这种修改。