Вопрос

Я хочу убедиться, что я понимаю, правильно понимаю Pass-Value VS Pass-Reasher. В частности, я смотрю на префикс / постфикс версии приращения ++ Оператор для объекта.

Давайте предположим, что у нас есть следующий класс X:

class X{
private:
    int i;
public:
 X(){i=0;}
 X& operator ++ (){ ++i; return *this; } //prefix increment

 X operator ++ (int unused){ //postfix increment
  X ret(*this);
  i++;
  return ret;
 }

 operator int(){ return i; } //int cast
};

Прежде всего, правильно реализовал операторы префикса / постфикс.

Во-вторых, как эффективность памяти - это оператор PostFix, по сравнению с префиксным оператором? Конкретно сколько X Объектные копии создаются, когда используется каждая версия оператора?

Объяснение именно то, что происходит с обратным платежом VS Return-by-value, может помочь мне понять.


Редактировать: Например, со следующим кодом ...

X a;
X b=a++;

... A и B теперь псевдонимы?

Это было полезно?

Решение

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

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

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

Эффективность вашей реализации выглядит наравне с типичными реализациями.

Редактировать: Что касается вашего дополнения, нет, они не псевдонимы. Вы создали два отдельных объекта. Когда вы возвращаетесь по значению (и когда вы создали новый объект из оператора PostFix Scirement), этот новый объект размещен в отчетливом местоположении памяти.

Однако в следующем кодексе A и B находятся псевдонимы:

 int a = 0;
 int& b = ++a;

B - адрес, который ссылается на.

Другие советы

Это более идиоматично называть приращение префикса самого объекта В приросте Postfix:

X operator++(int)
{
    X copy(*this);
    ++*this;         // call the prefix increment
    return copy;
}

Логика увеличения X Таким образом, объект содержится исключительно внутри версии префикса.

Ваши операторы реализованы правильно.

В префикс-операторе никаких копий X не производится.

В постфикс-операторе одна копия сделана для RET, а также потенциально Другая копия сделана при возврате из функции, но все компиляторы будут Elide этой копией.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top