Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用右值构造一对_C++_C++11 - Fatal编程技术网

C++ 用右值构造一对

C++ 用右值构造一对,c++,c++11,C++,C++11,在这方面: vector<pair<string,int>> vp; string s; int i; while(cin>>s>>i) vp.push_back({s,i}); 虽然该对的构造涉及相同的资源,但现在该对被命名为,p,因此它不再是一个右值,因此不再使用移动语义,因此这是传递值,导致复制,对吗 这对我来说意味着,在可能的情况下,在arg列表中构造对象是一种性能改进;有人能证实吗 该对是在对push_b

在这方面:

    vector<pair<string,int>> vp;
    string s;
    int i;
    while(cin>>s>>i) vp.push_back({s,i});
虽然该对的构造涉及相同的资源,但现在该对被命名为,
p
,因此它不再是一个右值,因此不再使用移动语义,因此这是传递值,导致复制,对吗

这对我来说意味着,在可能的情况下,在arg列表中构造对象是一种性能改进;有人能证实吗

该对是在对
push_back
的调用中构造的,因此它是移动的,而不是复制的,对吗

构造临时对,然后将其绑定到
push\u back
的右值引用参数。然后将其从该参数移动到
向量中

vp.push_back({s,i});
相当于:

vp.push_back(std::pair<std::string, int>{s, i});
std::pair<std::string, int> p{s, i};
vp.push_back(std::move(p));
或者甚至连中间对都没有:

vp.emplace_back(std::move(s), i);
这对我来说意味着,在可能的情况下,在arg列表中构造对象是一种性能改进;有人能证实吗

移动是一种性能改进,但您始终可以将参数
std::move()
放入函数中-它不需要是临时的。在arg列表中构造会影响何时调用从对象移动的析构函数,仅此而已

该对是在对
push_back
的调用中构造的,因此它是移动的,而不是复制的,对吗

构造临时对,然后将其绑定到
push\u back
的右值引用参数。然后将其从该参数移动到
向量中

vp.push_back({s,i});
相当于:

vp.push_back(std::pair<std::string, int>{s, i});
std::pair<std::string, int> p{s, i};
vp.push_back(std::move(p));
或者甚至连中间对都没有:

vp.emplace_back(std::move(s), i);
这对我来说意味着,在可能的情况下,在arg列表中构造对象是一种性能改进;有人能证实吗

移动是一种性能改进,但您始终可以将参数
std::move()
放入函数中-它不需要是临时的。在arg列表中构造会影响何时调用从对象移动的析构函数,仅此而已

你说得对

在arg列表中构造对象是一项改进

不过想一想<代码>整数
无法移动。这是一份副本。通常,将移动
std::string
,这将保护一个
malloc
/
new
调用

如果所有这些都不影响可读性,那就去做吧。否则,在大多数情况下,我相信这不会是一个很大的进步

我想再建议一种“方法”

更新-我删除了问题中删除的
cin
部分。

你是对的

在arg列表中构造对象是一项改进

不过想一想<代码>整数
无法移动。这是一份副本。通常,将移动
std::string
,这将保护一个
malloc
/
new
调用

如果所有这些都不影响可读性,那就去做吧。否则,在大多数情况下,我相信这不会是一个很大的进步

我想再建议一种“方法”


<强>更新< /Struts>我删除了代码> CIN < /C>部分,因为它被删除了。< / P>依赖编译器优化。第二个例子推一个相同的STD:::对,空STD::String和未知/随机int -正确?@ Nick真的,在这种情况下是空的(这个代码来自C++ FAQ)但我更关心推后退语义依赖于编译器优化。第二个例子推同一个STD::对,空STD::string和未知/随机int -正确?@ Nick Trand,在这个例子中,它们是空的(这个代码来自C++ FAQ),但是我更关心推后退语义为什么?1?因为

malloc()
?当然不是malloc。不必保存任何东西。根据库的不同,新的是引擎盖下的malloc。若字符串为空或sso,则根本不会有任何节省。如果字符串很大,您将避免使用new/malloc和memcpy/memmove。为什么-1?因为
malloc()
?当然不是malloc。不必保存任何东西。根据库的不同,新的是引擎盖下的malloc。若字符串为空或sso,则根本不会有任何节省。如果字符串很大,您将避免使用new/malloc和memcpy/memmove。在
std::move(p)
之后
p
会发生什么情况?@johnbakers则p将处于有效但未定义的状态
p
之后
std::move(p)
会发生什么情况?@johnbakers则p将处于有效但未定义的状态
vp.emplace_back(std::move(s), i);