метод копирования - PullRequest
       1

метод копирования

4 голосов
/ 30 сентября 2011

из стандартного определения метода разрешения копирования: в компьютерном программировании на С ++ разрешение копирования относится к технике оптимизации компилятора, которая исключает ненужное копирование объектов.давайте рассмотрим следующий код

#include <cstdlib>
#include <iostream>
using namespace std;
int n=0;
struct C 
{
 C (int) {}
 C(const C&) {++n;}      



       };
int main(int argc, char *argv[])
{
    C c1(42);
    C c2=42;




return n;
}

эта строка "return n" вернет либо 0, либо 1, в зависимости от того, была ли копия удалена.

также учитывает этот код

#include <iostream>

struct C {
  C() {}
  C(const C&) { std::cout << "Hello World!\n"; }
};

void f() {
  C c;
  throw c; // copying the named object c into the exception object.
}          // It is unclear whether this copy may be elided.

int main() {
  try {
    f();
  }
  catch(C c) { 
}
}

он говорит, что // копирует объект исключения во временный объект в объявлении исключения.// Также неясно, можно ли удалить эту копию.поэтому мой вопрос: насколько полезен такой метод оптимизации, если иногда результаты не определены? и вообще как часто он используется?

1 Ответ

8 голосов
/ 30 сентября 2011

Важным моментом является то, что стандарт явно разрешает это, и это означает, что вы не можете предполагать, что побочные эффекты конструктора копирования будут выполняться, поскольку копии могут быть исключены. Стандарт требует, чтобы реализация copy-constructor имела copy-constructor семантику, то есть, как целое назначение генерации второго объекта, семантически эквивалентного в вашем домене оригиналу объект. Если ваша программа соответствует этому, то оптимизация не повлияет на программу.

С другой стороны, это правда, что это единственная ситуация, которую я могу себе представить, когда стандарт допускает разные видимые результаты от одной и той же программы в зависимости от того, что делает компилятор, но вам советовали не иметь побочные эффекты в вашем конструкторе копирования (точнее, вы не можете зависеть от точного количества выполненных копий).

Что касается того, стоит ли это того, да, это так. Во многих случаях копии довольно дороги (я намеренно игнорирую move-constructors в C ++ 11 из обсуждения). Рассмотрим функцию, которая возвращает vector<int>, если копия не исключена, тогда требуется другое динамическое выделение, копирование всего содержимого вектора и затем освобождение исходного блока памяти, все три операции могут быть дорогими.

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

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