我已经阅读了关于 RVO 的 Dave Abrahams文章以及关于 SO(14043609、9293726 和 10818278)的其他一些问答,但我仍然有一个问题。当我编译并运行以下代码时,我得到以下输出:
Address of v in func 0x7fffac6df620
Address of v.data in func 0x2081010
Address of v in main 0x7fffac6df690
Address of v.data in func 0x20811b0
9
对我来说,似乎复制了一份。如何将大对象从函数中传递出去?请注意,我想返回一个或多个对象而不为其编写显式结构。我将 GCC 4.6.3 与 -O2 一起使用。编辑:前两个答案表明我对编译器的期望过高。我添加了一个以相同方式运行的 main2,例如打印的地址不同。我想强调一下,动机是大对象的有效返回。
#include <iostream>
#include <vector>
#include <tuple>
std::tuple<std::vector<int>, double> func() {
std::vector<int> v;
v.reserve(100);
for (int k=0;k!=100;k+=1)
v.push_back(k);
double a = 5.0;
std::cout << "Address of v in func\t" << &v << std::endl;
std::cout << "Address of v.data in func\t" << v.data() << std::endl;
return make_tuple(v, a);
}
int main() {
std::vector<int> v;
double a;
std::tie(v, a) = func();
std::cout << "Address of v in main\t" << &v << std::endl;
std::cout << "Address of v.data in func\t" << v.data() << std::endl;
std::cout << v[9] << std::endl;
return 0;
}
int main2() {
auto tp = func();
std::vector<int> & v = std::get<0>(tp);
double & a = std::get<1>(tp);
std::cout << "Address of v in main\t" << &v << std::endl;
std::cout << "Address of v.data in func\t" << v.data() << std::endl;
std::cout << v[9] << std::endl;
return 0;
}