我正在处理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()会怎么样?
答案 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);