我想避免复制vector,而改用rvalue引用。这些是方法。
bool GeckoChildProcessHost::SyncLaunch(std::vector<std::string>
aExtraOpts, int aTimeoutMs) {
if (!AsyncLaunch(std::move(aExtraOpts))) {
return false;
}
return WaitUntilConnected(aTimeoutMs);
}
bool GeckoChildProcessHost::AsyncLaunch(std::vector<std::string> aExtraOpts)
{
PrepareLaunch();
#if defined(XP_MACOSX) && defined(MOZ_SANDBOX)
if (IsMacSandboxLaunchEnabled()) {
AppendMacSandboxParams(aExtraOpts);
}
#endif
MessageLoop* ioLoop = XRE_GetIOMessageLoop();
MOZ_ASSERT(mHandlePromise == nullptr);
mHandlePromise = new HandlePromise::Private(__func__);
// Currently this can't fail (see the MOZ_ALWAYS_SUCCEEDS in
// MessageLoop::PostTask_Helper), but in the future it possibly
// could, in which case this method could return false.
ioLoop->PostTask(NewNonOwningRunnableMethod<std::vector<std::string>>(
"ipc::GeckoChildProcessHost::RunPerformAsyncLaunch", this,
&GeckoChildProcessHost::RunPerformAsyncLaunch, aExtraOpts));
return true;
}
我该怎么做?我也相信我需要改变他们的呼叫者以使用举动。我该怎么做? 这是呼叫者之一的代码。
bool GeckoChildProcessHost::LaunchAndWaitForProcessHandle( StringVector
aExtraOpts) {
if (!AsyncLaunch(std::move(aExtraOpts))) {
return false;
}
MonitorAutoLock lock(mMonitor);
while (mProcessState < PROCESS_CREATED) {
lock.Wait();
}
MOZ_ASSERT(mProcessState == PROCESS_ERROR || mChildProcessHandle);
return mProcessState < PROCESS_ERROR;
}
感谢您的帮助。谢谢!
答案 0 :(得分:0)
但是没有专门使用vector &&的地方。这基本上就是我想要做的。
您确定要这样做吗?这是您之前写的:
我要避免复制vector
因此,如果我理解正确,您想移动矢量而不是复制它。
问题是您现在可以正确执行所有操作。您不得自己使用右值引用来移动数据。实际上,对函数参数使用右值引用将阻止移动(它将通过引用而不是移动传递)。右值引用用于实现移动语义。您真正想要移动变量的方法是在按值传递变量时使用std::move
,从而引起移动,而您已经这样做了。
请参见,move和copy构造函数位于同一重载集中。向其发送右值时可以调用它的优化版本的“副本”。有时您仍然希望编译器选择优化版本,因为您不在乎变量会发生什么。函数std::move
可以做到这一点。只需将左值转换为右值即可。然后,move构造函数执行实际的移动。
在您的代码中,您可以这样做:
// no copy, even if AsyncLaunch is taking by
// value, since we 'move' into the value
!AsyncLaunch(std::move(aExtraOpts))
您将aExtraOpts
转换为一个右值,该右值将数据移动到value参数中。如果该函数通过引用(或右值引用)接受其参数,则根本没有任何动作,只需引用即可。