проблема копирования конструктора при чтении объекта непосредственно в вектор с использованием итераторов копирования и потока - PullRequest
0 голосов
/ 20 ноября 2010

Может ли какое-то тело объяснить поведение в выводе при выполнении следующего кода. Меня немного смущает, сколько раз вызывается конструктор копирования.

using namespace std;
class A {
    int i;
public:
    A() {
    };
    A(const A& a) {
        i = a.i;
        cout << "copy constructor invoked" << endl;
    };
    A(int num) {
        i = num;
    };
    A& operator = (const A&a) {
        i = a.i;
//      cout << "assignment operator invoked" << endl;
    };
    ~A() {
        cout << "destructor called" << endl;
    };
    friend ostream& operator << (ostream & out, const A& a);
    friend istream& operator >> (istream &in, A&a);
};

ostream & operator << (ostream &out, const A& a) {
    out << a.i;
    return out;
}

istream & operator >> (istream & in, A&a) {
    in >> a.i;
    return in;

}
int main() {
    vector<A> vA;
    copy(istream_iterator<A>(cin), istream_iterator<A>(), back_inserter(vA));
//  copy(vA.begin(), vA.end(), ostream_iterator<A>(cout, "\t"));
    return 0;
}

Полученный результат равен


ajay@ubuntu:~/workspace/ostream_iterator/src$ ./a.out 
40
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
destructor called
destructor called
destructor called
destructor called
destructor called
destructor called
destructor called
destructor called
destructor called
destructor called
destructor called
destructor called
destructor called
ajay@ubuntu:~/workspace/ostream_iterator/src$ 


Я думал, что конструктор копирования будет вызываться один раз при вставке в вектор, так как контейнеры хранят объекты по значениям.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2010

istream_iterator собирается и копируется несколько раз.Вот мой вывод:

40
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
destructor called
destructor called
destructor called
destructor called
copy constructor invoked
copy constructor invoked
destructor called
copy constructor invoked
copy constructor invoked
destructor called
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
copy constructor invoked
0 голосов
/ 20 ноября 2010

Конструктор копирования должен вызываться как минимум 3 раза:

  • 1 копия за istream_iterator передана std::copy, а istream_iterator хранит местный значение параметризованного типа и скорее всего копирует его в свою копию конструктор, и они проходят мимо значение до std::copy. (2)
  • 1 для вставки в vector<A> vA через vA.push_back(...), вызываемый back_inserter(vA) назначение оператор. (3)

Компилятор, вероятно, может оптимизировать несколько таких копий, но откуда взялись остальные 8, для меня загадка.

РЕДАКТИРОВАТЬ: Между прочим, я получил 8 вызовов конструктора копирования, работающего на codepad.org: http://codepad.org/THFGFCCk

EDIT2: Когда я запустил это с VS2008, я получил 7 вызовов конструктора копирования. Дополнительные 4 были результатом копирования итераторов ввода в std::copy для проверки границ в отладочной сборке. При работе в полностью оптимизированной сборке я получаю только 3 вызова конструктору копирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...