Qt并发运行,通过引用传递值,但内存地址不同

Qt concurrent run, pass value by reference, but the memory address is different?

本文关键字:内存 地址 运行 并发 引用 Qt      更新时间:2023-10-16

我使用QtConcurrent::run运行函数,并通过引用传递值,但值的内存地址不同。

但是如果我通过指针传递值,地址是一样的!我想不明白。我错过什么了吗?

这是代码。

void ptr(QString* s)
{
    qDebug() << "pass by ptr: " << s;
}
void ref(QString& s)
{
    qDebug() << "pass by ref: " << &s;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QString str;
    QFuture<void> f1 = QtConcurrent::run(ptr, &str);
    f1.waitForFinished();
    QFuture<void> f2 = QtConcurrent::run(ref, str);
    f2.waitForFinished();
    qDebug() << "address of str: " << &str;
    return a.exec();
}
输出:

pass by ptr:  0x28fefc
pass by ref:  0x525de4
address of str:  0x28fefc

QtConcurrent::run创建您传递给它的所有参数的内部副本。然后,您的线程函数可以访问这些副本,而不是原始参数。通过原始引用传递内容并不会阻止副本的创建。换句话说,QtConcurrent::run在内部强制按值传递语义。

您在ref函数中看到的地址是该内部副本的地址。

由于这个原因,如果你特别想访问原始对象,而不是裸引用,你必须使用指针语义或"可复制引用"语义。

如果您想要/需要使用引用,请使用std::ref。新的代码将是:

#include <functional>
...
QFuture<void> f2 = QtConcurrent::run(ref, std::ref(str));