Rio*_*iot 78 push-back move-semantics c++11 emplace
在C++中,11 emplace_back()通常是优选的(在效率方面),push_back()因为它允许就地构造,但是当使用push_back(std::move())已经构造的对象时仍然是这种情况吗?
例如,emplace_back()在以下情况下仍然是首选?
std::string mystring("hello world");
std::vector<std::string> myvector;
myvector.emplace_back(mystring);
myvector.push_back(std::move(mystring));
// (of course assuming we don't care about using the value of mystring after)
Run Code Online (Sandbox Code Playgroud)
另外,在上面的例子中有没有任何好处来代替:
myvector.emplace_back(std::move(mystring));
Run Code Online (Sandbox Code Playgroud)
或者这里的举动完全是多余的,还是没有效果?
Arn*_*rtz 107
让我们看看你提供的不同电话会做什么:
emplace_back(mystring):这是一个新元素的就地构造,无论你提供什么参数.由于您提供了左值,因此就地构造实际上是复制构造,即这与调用相同push_back(mystring)
push_back(std::move(mystring)):这称为move-insertion,在std :: string的情况下是一个就地移动构造.
emplace_back(std::move(mystring)):这又是一个带有你提供的参数的就地构造.由于该参数是一个rvalue,它调用move-constructor std::string,即它就像2中那样的就地移动构造.
换句话说,如果使用类型T的一个参数调用,则它是rvalue或lvalue,emplace_back并且push_back是等价的.
但是,对于任何其他参数,emplace_back赢得比赛,例如char const*在a中vector<string>:
emplace_back("foo")要求string::string(char const*)就地建设.
push_back("foo")首先必须调用string::string(char const*)匹配函数签名所需的隐式转换,然后调用像上面的情况2那样的移动插入.因此它相当于push_back(string("foo"))
| 归档时间: |
|
| 查看次数: |
23161 次 |
| 最近记录: |