Скопировать исключение, используя STL (вектор как пример)

Я читал о копировании в C++. И у меня были сомнения по поводу STL в C++, используя эту копию elision.

Следующий код:

#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;
}

Поэтому я делал простую задачу (объединяя) векторы A и B (не обращая внимания на процесс, только на функцию и возврат).

vector<int> merge(vector<int> &arrA, vector<int> &arrB)

Со следующим определением он возвращает vector<int> (без ссылки)

А также return result; которая является переменной, объявленной в области видимости функции.

Я пытался увидеть адрес памяти, по которому расположены эти векторы. выход:

==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). Значит ли это, что он создан копированием?

Является ли этот метод копией elision?

  • если нет: почему это не копия elision?
  • если да: как я могу узнать, что это действительно делает копию?

И важный: если это не копирование, возможно ли это сделать? что нужно для того, чтобы сделать копию в STL?

1 ответ

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

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

Другие вопросы по тегам