2016-10-09 5 views
-1

Я читал о копировании 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?

+1

Этот вопрос не связан с копией elision в «STL» (независимо от того, что предназначено для ссылки), но и о копировании в пользовательском коде. –

+2

Попробуйте 'vector res = merge (arrA, arrB);' вместо этого. –

+0

@SamVarshavchik спасибо !, поэтому в соответствии с этим. Копирование-исключение происходит только тогда, когда деление находится в той же строке, что и вызов функции. это верно? – Miguel

ответ

1

Для копирования текста вам необходимо иметь «копию» в первую очередь, то есть ваш вектор res должен быть скопирован из возвращаемого значения.
В противном случае у вас будет только задание, которое требует избавиться от всего, что было в векторе, и как таковое не может быть отменено.

Обратите внимание, что это все равно будет назначение перемещения, поэтому недостатка будет не так много (вы можете проверить его также с помощью memcheck).

 Смежные вопросы

  • Нет связанных вопросов^_^