Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > выполнение ++i


Автор: nmn 26.12.2009, 06:21
здравствуйте

слышал говорят что ++a будет выполняться чуть быстрее чем a++, почему?

Автор: cristaloleg 26.12.2009, 09:18
уже была такая статья...ищи в важных

Автор: fry 26.12.2009, 09:30
Могу разочаровать, с --а и а-- та же хрень творится.

Автор: Peter 26.12.2009, 12:56
Не знаю наверняка, но догадываюсь.
++a увеличивает значение a на единицу и возвращает это новое значение, а a++ возвращает старое значение. Таким образом, в первом случае достаточной одной ячейки памяти и работы над ней, а во втором необходимо две - для a и старого значения.

Автор: djamshud 26.12.2009, 13:41
Peter абсолютно прав. Добавлю лишь, что компиляторы уже давным давно научились превращать i++ в ++i, когда это возможно. Так что как правило об этом можно не париться.

Автор: nmn 26.12.2009, 14:03
спасибо

Автор: xvr 26.12.2009, 21:52
Если a -это какой нибудь класс, то эффективность выполнения ++a и a++ целиком определяется им самим. В этом случае (с точки зрения здравого смысла и семантики префиксных и постфиксных операций инкремента) ++a должно быть эффективнее

Автор: nmn 27.12.2009, 06:40
Цитата(xvr @  26.12.2009,  21:52 Найти цитируемый пост)
В этом случае (с точки зрения здравого смысла и семантики префиксных и постфиксных операций инкремента) ++a должно быть эффективнее

можно про это поподробнее

Автор: xvr 27.12.2009, 12:04
Цитата

можно про это поподробнее 

Peter уже писал подробнее, но могу повторить:
Префиксный инкремент должен увеличить сущность, к которой он применен, и вернуть ее (это семантика ++a в C++). Т.е. при реализации оператором в классе он обычно продвигает то, на что класс указывает, после чего возвращает референс на сам класс с помощью конструкции *this.
Постфиксный инкремент так же увеличивает сущность, но возвращает ЕЕ КОПИЮ ДО увеличения. Что обычно реализуется как
Код

Obj Obj::operator++ (int)
{
 Obj rv=*this;
 this->operator ++();
 return rv;
}
Т.е. по сравнению с префиксным инкрементом имеем:
  •  Создание нового объекта с помощью copy-contructor
  •  Возврат объекта по значению (что так же добавляет конструктор и деструктор)


Автор: bsa 29.12.2009, 11:25
nmn, http://forum.vingrad.ru/forum/topic-269794/kw-faq-c++.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)