Я читал о копировании elision в C++. И я сомневался в STL в C++, используя этот экземпляр elision.копия elision с использованием STL (в качестве примера)
Следующий код:
#include <vector>
#include <iostream>
using namespace std;
vector<int> merge(vector<int> &arrA, vector<int> &arrB)
{
int x;
vector<int> result;
for(x = 0; x < arrA.size(); x++)
{
result.push_back(arrA[x]);
}
for(x = 0; x < arrB.size(); x++)
{
result.push_back(arrB[x]);
}
cout << "fun return: " << &result <<endl;
return result;
}
int main(int argc, char const *argv[])
{
vector<int> arrA;
arrA.push_back(1);
vector<int> arrB;
arrB.push_back(2);
vector<int> res;
res = merge(arrA, arrB);
cout << "return: " << &res <<endl;
return 0;
}
Так что я делаю простую задачу (слияние) векторы А и В (не обращать внимание на процесс, только функцию и возврат
vector<int> merge(vector<int> &arrA, vector<int> &arrB)
.
Со следующим определением он не возвращающей vector<int>
(без ссылки)
А также return result;
, которая является переменной, объявленной в функции SCO физическое воспитание
Я пытался увидеть адрес памяти, в котором эти векторы расположены. выход:
==5036== Memcheck, a memory error detector
==5036== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==5036== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==5036== Command: ./a.out
==5036==
fun return: 0xffefffe40
return: 0xffefffe20
==5036==
==5036== HEAP SUMMARY:
==5036== in use at exit: 0 bytes in 0 blocks
==5036== total heap usage: 5 allocs, 5 frees, 28 bytes allocated
==5036==
==5036== All heap blocks were freed -- no leaks are possible
==5036==
==5036== For counts of detected and suppressed errors, rerun with: -v
==5036== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Адрес памяти различен для обоих, так что я имел в виду, что до тех пор, как он будет не сделать копию-construtor, это будет тот же адрес памяти в конце (0xffefffe40) ли это означает, что он копируется?
Этот метод является копией элиции?
- если нет: почему это не копия элиции?
- если да: Как я могу знать, что это действительно делает копию?
И важно: если это не копирование, возможно ли это сделать? что необходимо для того, чтобы сделать копию в STL?
Этот вопрос не связан с копией elision в «STL» (независимо от того, что предназначено для ссылки), но и о копировании в пользовательском коде. –
Попробуйте 'vector res = merge (arrA, arrB);' вместо этого. –
@SamVarshavchik спасибо !, поэтому в соответствии с этим. Копирование-исключение происходит только тогда, когда деление находится в той же строке, что и вызов функции. это верно? – Miguel