如果我采取这样的两个对象:
$(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);
}
但对于我不知道的信号,我认为矢量需要被复制,因为它是受保护的变量。
答案 0 :(得分:0)
我总是说const
引用传递复杂对象,除非你有充分的理由不这样做。对于int
和bool
这样的原始类型,通常最好按原样传递它们。
您需要了解的是信号和插槽都只是功能。信号有点特殊,因为你自己没有实现它,MOC就是这样做的。但它仍然只是一个功能!通过使用const
,您可以避免不必要的复制,这对于共享类来说是一件好事,但在复制需要大量资源时尤其如此,例如vector
。
一个重要的事情是信号槽连接有两种形式:直接连接和排队连接。对于直接连接信号,基本上直接调用所有连接的插槽,所以当你这样做时
emit doSomething(51, m_somevector, true);
它只调用连接的插槽并将参数传递给它们。
对于排队连接,Qt会复制参数,对它们进行排队,然后在另一个线程中调用这些插槽。即使您声明传递引用,也会生成副本,因此仍然可以正常工作。
这确实没有理由按值传递复杂对象,除非在调用正在进行时存在对象发生某些事情的风险。例如,可能是某些槽在向量上迭代,并且在迭代期间调用一些修改向量的方法。这可能会破坏迭代过程。但即使这样,您也可以在该方法内迭代一个副本,并仍然根据您的需要通过引用传递参数。或者只是重新设计整个事物以避免这种修改。