为什么此插入创建副本? 我看C++学习更多,我没有得到这个解释(上面提到的视频的确切时间戳)。< /P>
代码是为什么此插入创建副本? 我看C++学习更多,我没有得到这个解释(上面提到的视频的确切时间戳)。< /P>,c++,C++,代码是 void Benchmark_Slow(int iters){ std::unordered_map<string, int> m; std::pair<const string, int> p = {}; while (iters--) m.insert(p); // ^ // Why does this create a copy? } void Benchmark\u Slow(i
void Benchmark_Slow(int iters){
std::unordered_map<string, int> m;
std::pair<const string, int> p = {};
while (iters--) m.insert(p);
// ^
// Why does this create a copy?
}
void Benchmark\u Slow(int iters){
std::无序映射m;
std::pair p={};
而(iters--)m.insert(p);
// ^
//为什么要创建副本?
}
他说调用了&
重载,而不是常量&
重载,从而创建了一个副本。我试图理解这一点的问题是
m.insert(std::move(p))
是否修复了此问题你把它倒过来了。将调用
常量&
重载,而不是&
。另外,在标题中,你问的是创建一个临时文件,但在问题正文中,你说的是创建一个副本。它是哪一个?请这样想:当前该对象属于您的函数,并且在函数返回时将被销毁。如果您希望将同一对象(而不是副本)存储在映射中(这意味着它必须在从映射中删除之前保持活动状态,而不是在函数返回之前),则必须将其所有权转移到映射,您可以使用std::move
(这将调用&
重载)。这是因为C++没有垃圾收集程序,否则将管理对象生存期。演讲者说它调用了&
重载,但不确定你所说的&
是什么意思。这将指示一个移动构造函数,在这种情况下不应该发生。无论如何,变量p
是Benchmark\u Slow
堆栈中的堆栈变量,而映射指向的内容必须是heap。因此,如果这不会复制,那将是可疑的。另外,如果它不复制,地图会多次指向内存中的同一位置,对吗?那太糟糕了。如果您确实想避免调用副本,请使用移动操作,或者更好的std::unordered_map::emblace
@Aziuth您看了视频吗?演讲者说它调用了'ref-ref'重载,我假设它是&&
,意思是移动构造函数。我要求澄清为什么它会像发言者所说的那样抄袭。