разрушение элемента контейнера C++ станд. и поведение вставки

Вы могли также отредактировать файл текста таблиц крона непосредственно, но Ваше решение кажется совершенно приемлемым.

5
задан AndreasT 7 September 2009 в 14:27
поделиться

4 ответа

Почему я вообще пытаюсь передать что-то в качестве ссылки, если оно все равно копируется дважды?

Вы должны рассматривать типы контейнеров STL как черный ящик, который может копировать объекты, которые вы храните, сколько угодно раз. к. Например, каждый раз, когда размер контейнера изменяется, все объекты будут скопированы.

Возможно, что реализация вашего компилятора push_back () использует временную дополнительную копию. На моей машине (gcc в Mac OS X) нет дополнительных копий во время push_back () (в соответствии с выводом вашей программы).

Эта копия происходит где-то в коде STL, а не в вашей копии конструктор (поскольку он использует ссылку).

Почему v1.operator = (other) не уничтожает содержащиеся в нем элементы?

Foo :: operator = будет вызываться для экземпляра "albert" с "берт" экземпляр как аргумент. Следовательно, здесь нет неявных операций уничтожения и копирования. Вы можете проверить это, предоставив свою собственную реализацию для оператора:

Foo& operator=(const Foo& other) {
    cout << "Instance " << other._name << " of Foo assigned to " << _name << "!" << std::endl;
    return *this;
}

Это дает следующий результат на моей машине:

Экземпляр Альберта из Foo создан!
Создан экземпляр Берта из Фу!
Экземпляр, скопированный Альбертом из Foo!
Экземпляр Берт из Фу скопировал!
Экземпляр Берта из Фу назначен Альберту!
Экземпляр Берта из Фу уничтожен!
Экземпляр Альберта из Фу уничтожен!
Экземпляр Берта из Фу уничтожен!
Экземпляр Альберта из Фу уничтожен!

4
ответ дан 14 December 2019 в 01:12
поделиться

Есть автоматически сгенерированный оператор =. Когда вы делаете v1 = v2, этот оператор используется. В этот момент один из экземпляров «альберта» становится «бертом». Попробуйте добавить эту функцию в Foo:

Foo& operator = (const Foo& rval) {
    cout << _name << " = " << rval._name << endl;
    _name = rval._name;
    return *this;
}

Это то же самое, что и автоматически сгенерированное, но распечатывает отладочное сообщение, чтобы вы могли видеть, что происходит.

3
ответ дан 14 December 2019 в 01:12
поделиться

"Двойное копирование" не происходит при компиляции с GCC. Это должно быть специфическим для способа реализации std :: vector в VC ++.

1
ответ дан 14 December 2019 в 01:12
поделиться

Visual Studio 2008 дает мне следующий результат:

Instance Albert of Foo created!
Instance Bert of Foo created!
Press any key to continue . . .
Instance Albert of Foo copied!
Press any key to continue . . .
Instance Bert of Foo copied!
Press any key to continue . . .
Press any key to continue . . .  << here auto-generated operator= doing its job
Instance Bert of Foo destroyed!
Instance Bert of Foo destroyed!  << this is Albert was originally 
Press any key to continue . . .

Похоже, что реализация std :: vector не очень эффективна в VS2005.

1
ответ дан 14 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: