【发布时间】:2010-09-02 03:52:51
【问题描述】:
在尝试理解来自 here 的右值引用时,我无法理解两件事
- 如果向量中有 N 个字符串,每个副本可能需要 多达 N+1 个内存分配和 [...]
'N+1' 中的 +1 是什么?
2.作者是如何突然得出下面的指导方针的
准则:不要复制你的函数 论据。相反,按值传递它们 并让编译器进行复制。
我错过了什么吗?
【问题讨论】:
标签: c++ reference rvalue-reference
在尝试理解来自 here 的右值引用时,我无法理解两件事
- 如果向量中有 N 个字符串,每个副本可能需要 多达 N+1 个内存分配和 [...]
'N+1' 中的 +1 是什么?
2.作者是如何突然得出下面的指导方针的
准则:不要复制你的函数 论据。相反,按值传递它们 并让编译器进行复制。
我错过了什么吗?
【问题讨论】:
标签: c++ reference rvalue-reference
'N+1' 中的 +1 是什么?
一次分配为新向量创建底层数组,然后是 N 次分配,为向量中的 N 个字符串中的每一个分配一次。
作者是如何突然得出下面的指导方针的
他认为不是明确在函数内部制作副本,
std::vector<std::string>
sorted2(std::vector<std::string> const& names) // names passed by reference
{
std::vector<std::string> r(names); // and explicitly copied
std::sort(r);
return r;
}
当你将参数传递给函数时,你应该让编译器制作副本,
std::vector<std::string>
sorted2(std::vector<std::string> names) // names passed by value
{ // and implicitly copied
std::sort(names);
return names;
}
【讨论】:
return std::move(names) 的右值引用 (std::vector<std::string> &&) 来降低第二种情况下的复制成本