在 pair.first 上使用 std::move 会使 pair.second 无效吗?
Does using std::move on pair.first invalidate pair.second?
目前我的项目中有以下代码:
std::vector<int> vectorOfFirsts;
std::set<double> setOfSeconds;
std::list<std::pair<int,double>> cachedList;
// do something to fill the list
for (const auto& pair : cachedList)
{
vectorOfFirsts.push_back(pair.first);
setOfSeconds.insert(pair.second);
}
这个列表会很大,只需要填充vector和set(即内容可以无效)。我现在的问题是,如果以下优化是个好主意:
for (const auto& pair : cachedList)
{
vectorOfFirsts.push_back(std::move(pair.first));
setOfSeconds.insert(std::move(pair.second));
}
在 pair.first 上调用 std::move 是否会以某种方式使 pair.second 无效?这段代码会为循环提供任何加速吗?我知道填充 vector/set 而不是列表可能是个好主意,但列表是通过一些遗留代码填充的,我无法控制/没有时间深入研究。
Will calling std::move on pair.first somehow invalidate pair.second?
没有。 first
和 second
是完全不同的变量,恰好驻留在某些 class 对象中。移动一个不影响另一个。
And will this code provide any speedup for the loop?
这取决于类型。 move
-ing 的目的基本上是转移资源。由于这里的pairs是int
s和double
s,不涉及资源,所以没有什么可以转移的。如果它是一对矩阵类型和张量类型,每个都有一些内部动态分配的缓冲区,那么它可能会提高性能。
停止。
花点时间考虑一下这段代码。内嵌评论
// step one - iterate through cachedList, binding the dereferenced
// iterator to a CONST reference
for (const auto& pair : cachedList)
{
// step 2 - use std::move to cast the l-value reference pair to an
// r-value. This will have the type const <pairtype> &&. A const
// r-value reference.
// vector::push_back does not have an overload for const T&& (rightly)
// so const T&& will decay to const T&. You will copy the object.
vectorOfFirsts.push_back(std::move(pair.first));
// ditto
setOfSeconds.insert(std::move(pair.second));
}
需要是:
for (auto& pair : cachedList)
{
vectorOfFirsts.push_back(std::move(pair.first));
setOfSeconds.insert(std::move(pair.second));
}
是的,这将成为移动的有效和合法使用。
目前我的项目中有以下代码:
std::vector<int> vectorOfFirsts;
std::set<double> setOfSeconds;
std::list<std::pair<int,double>> cachedList;
// do something to fill the list
for (const auto& pair : cachedList)
{
vectorOfFirsts.push_back(pair.first);
setOfSeconds.insert(pair.second);
}
这个列表会很大,只需要填充vector和set(即内容可以无效)。我现在的问题是,如果以下优化是个好主意:
for (const auto& pair : cachedList)
{
vectorOfFirsts.push_back(std::move(pair.first));
setOfSeconds.insert(std::move(pair.second));
}
在 pair.first 上调用 std::move 是否会以某种方式使 pair.second 无效?这段代码会为循环提供任何加速吗?我知道填充 vector/set 而不是列表可能是个好主意,但列表是通过一些遗留代码填充的,我无法控制/没有时间深入研究。
Will calling std::move on pair.first somehow invalidate pair.second?
没有。 first
和 second
是完全不同的变量,恰好驻留在某些 class 对象中。移动一个不影响另一个。
And will this code provide any speedup for the loop?
这取决于类型。 move
-ing 的目的基本上是转移资源。由于这里的pairs是int
s和double
s,不涉及资源,所以没有什么可以转移的。如果它是一对矩阵类型和张量类型,每个都有一些内部动态分配的缓冲区,那么它可能会提高性能。
停止。
花点时间考虑一下这段代码。内嵌评论
// step one - iterate through cachedList, binding the dereferenced
// iterator to a CONST reference
for (const auto& pair : cachedList)
{
// step 2 - use std::move to cast the l-value reference pair to an
// r-value. This will have the type const <pairtype> &&. A const
// r-value reference.
// vector::push_back does not have an overload for const T&& (rightly)
// so const T&& will decay to const T&. You will copy the object.
vectorOfFirsts.push_back(std::move(pair.first));
// ditto
setOfSeconds.insert(std::move(pair.second));
}
需要是:
for (auto& pair : cachedList)
{
vectorOfFirsts.push_back(std::move(pair.first));
setOfSeconds.insert(std::move(pair.second));
}
是的,这将成为移动的有效和合法使用。