Qt隐式共享类 - 调用函数传递和按值返回是否昂贵?

时间:2014-01-10 17:04:53

标签: c++ qt implicit-conversion qstring

我正在处理QString,一个Qt的隐式共享类。我对隐式共享类的理解是,在复制对象时,实际数据不是复制,只复制指向数据的指针。它只会写入时复制(调用非const函数时)。 (如果我错了,请纠正我)

我想知道以下代码是否过于昂贵而无法与隐式共享类一起使用:

// assume I have no control over those functions
QString giveMeAString();
void acceptStringReference(const QString &stringRef);

// I have control over this function
QString replaceSomething(QString input) { // shallow copy here
    input.replace("foo", "bar");          // deep copy here
    return input;                         // shallow copy here
}

// will this function expensive to call?
acceptStringReference(replaceSomething(giveMeAString());

或者我应该使用指针?调用函数比传递如下所示的QString指针(但代码更多)更昂贵吗?

void replaceSomething(QString *input) {
    input.replace("foo", "bar");
}

QString *stringPtr = new QString(giveMeAString());
replaceSomething(stringPtr);
acceptStringReference(*stringPtr);
delete stringPtr;

另外3行可能看起来更少,但如果我需要多次调用replaceSomething()会怎么样?

2 个答案:

答案 0 :(得分:1)

你的第一个例子是非常正确的,在这种情况下,copy-on-write将很好用。

第二个例子与第一个例子完全相同。唯一的区别是,在第一种情况下,giveMeAString()返回的临时对象存储在堆栈中,而在第二种情况下,此对象(stringPtr)在堆中显式创建。动态分配小内存块是缓慢且毫无意义的。第二个例子会因此而变慢。在两种情况下,QString缓冲区的内部处理都是完全相同的。

答案 1 :(得分:0)

这个怎么样?

void replaceSomething(QString *input) {
    input->replace("foo", "bar");
}

QString string = giveMeAString();
replaceSomething(&string);
acceptStringReference(string);