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

mov*_*vef 7 c++ qt multithreading qtconcurrent

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();
}
Run Code Online (Sandbox Code Playgroud)

输出:

pass by ptr:  0x28fefc
pass by ref:  0x525de4
address of str:  0x28fefc
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 13

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

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

因此,如果您特别想要访问原始对象,而不是裸引用,则必须使用具有指针语义或"可复制引用"语义的内容.

  • 或者使用透明的可复制引用包装,如[`boost :: ref`](http://www.boost.org/doc/libs/1_55_0/doc/html/ref.html)和[`std :: ref`](http://en.cppreference.com/w/cpp/utility/functional/ref)(仅限C++ 11) (2认同)

Tob*_*ias 5

如果你想/需要使用引用,请使用std :: ref.新代码将是:

#include <functional>
...

QFuture<void> f2 = QtConcurrent::run(ref, std::ref(str));
Run Code Online (Sandbox Code Playgroud)