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函数中看到的地址是该内部副本的地址.
因此,如果您特别想要访问原始对象,而不是裸引用,则必须使用具有指针语义或"可复制引用"语义的内容.
如果你想/需要使用引用,请使用std :: ref.新代码将是:
#include <functional>
...
QFuture<void> f2 = QtConcurrent::run(ref, std::ref(str));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2655 次 |
| 最近记录: |