【发布时间】:2010-09-13 18:30:26
【问题描述】:
我想知道以下三种方法之间是否有区别:
void FillVector_1(vector<int>& v) {
v.push_back(1); // lots of push_backs!
}
vector<int> FillVector_2() {
vector<int> v;
v.push_back(1); // lots of push_backs!
return v;
}
vector<int> FillVector_3() {
int tab[SZ] = { 1, 2, 3, /*...*/ };
return vector<int>(tab, tab + SZ);
}
【问题讨论】:
-
当你觉得这实际上是一个问题时,只需按值返回并担心性能。然后对其进行概要分析,这样您就不必猜测了。我以duplicate 的身份抢先关闭。
-
由于以下几个原因,我不会投票决定将其作为重复项关闭:(1) 较早的问题有关于动态内存分配的细节不适用于这个问题,以及 (2) 这个question 是特定于 STL 的,它可以调用其他惯用语,例如插入迭代器。此外,STL 的一些实现已经利用 C++0x r-value 引用来最小化复制。该方法不适用于前面的问题。
-
@GMan:虽然我同意不要过早进行微优化的观点,但我不同意理所当然应该按值返回大型对象的观点。特别是当涉及到 STL 集合时,有更好的方法。例如,通过编写函数来接受一个输出迭代器,我们可以使其更具适应性和更多的 STL 风格,同时避免不得不依赖 RVO 或时髦的编译器优化,这些优化可能会以不合需要的方式改变程序的行为。此外,C++ 程序员应该知道他们的对象何时被复制——而不是代码和祈祷
-
@John:这不是代码和祈祷,而是代码和让你的程序工作然后-profile-it-to-see-what-can-be-sped-up-and-别再胡思乱想了。 @Adrian @John:迭代器设计确实可能是最好的编码方式,但就目前而言,问题本身显然只是“哦,我当然不能按价值返回!”的毫无根据的情况。但是,当我喜欢超越问题的表面并解决“真正的”问题时,您是对的;我正在投票重新开放。