Я прочитал Dave Abrahams article на RVO и еще несколько Q/As на SO (14043609, 9293726 и 10818278), но у меня все еще есть вопрос. Когда я компилирую и запускаю следующий код, я получаю этот вывод:Почему RVO не происходит здесь?
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;
}
Я добавил второй пример, который должен быть эквивалентен вашему коду. Однако он все еще не использует RVO. Я что-то упустил? – Mankka