i++ and ++i
От: Аноним  
Дата: 21.04.06 14:12
Оценка:
Вопрос — что быстрее.
Понятно, что если i — объект класса, ну например какой-сь std::iterator, то ++i быстрее, но недавно где то увидел фразу, что лучше использовать префиксный, потому что он быстрее, и это было в контексте такой операции:

for (int i = 0; i < MAX; i++) {}


Возник вопрос, а как работают стандартные типы? Как быстрее?
Спасибо
Re: i++ and ++i
От: achp  
Дата: 21.04.06 14:15
Оценка: :))) :)
Здравствуйте, Аноним, Вы писали:

А>Возник вопрос, а как работают стандартные типы? Как быстрее?


На практике, если компилятор был выпущен после окончания палеолита, то совершенно одинаково.
Re: i++ and ++i
От: rg45 СССР  
Дата: 21.04.06 14:17
Оценка: +1
" Аноним " <0@users.rsdn.ru> wrote in message news:1861563@news.rsdn.ru...
> Вопрос — что быстрее.
> Понятно, что если i — объект класса, ну например какой-сь std::iterator, то ++i быстрее, но недавно где то увидел фразу, что лучше использовать префиксный, потому что он быстрее, и это было в контексте такой операции:
>
>
> for (int i = 0; i < MAX; i++) {}
>

>
> Возник вопрос, а как работают стандартные типы? Как быстрее?
> Спасибо

Именно в таком примере, как приводишь ты, компилятор с оптимизатором сгенерирует одинаковый код при использовании как префиксного так и постфиксного инкремента. Но в общем случае, префиксный инкремент быстрее, т.к. он кроме модификации объекта ничего больше не делает. А постфиксный инкремент сначала создает временную копию объекта, потом выполняет ту работу, которую выполняет префиксный инкремент, а потом возвращает ранее сделанную копию.
Posted via RSDN NNTP Server 2.0
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: i++ and ++i
От: Bell Россия  
Дата: 21.04.06 14:18
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Вопрос — что быстрее.

А>Понятно, что если i — объект класса, ну например какой-сь std::iterator, то ++i быстрее, но недавно где то увидел фразу, что лучше использовать префиксный, потому что он быстрее, и это было в контексте такой операции:

А>
А>for (int i = 0; i < MAX; i++) {}
А>


А>Возник вопрос, а как работают стандартные типы? Как быстрее?

Для встроенных типов оптимизатор вполне может заменить постфиксный инкримент на префиксный, так что на практике, скорее всего, никакой разницы не будет. Однако имеет смысл выработать привычку, и использовать постфиксную форму только тогда, когда это действительно нужно.
Любите книгу — источник знаний (с) М.Горький
Re: i++ and ++i
От: Аноним  
Дата: 21.04.06 14:18
Оценка: -1 :)
Здравствуйте, Аноним, Вы писали:

А>Вопрос — что быстрее.

А>Понятно, что если i — объект класса, ну например какой-сь std::iterator, то ++i быстрее, но недавно где то увидел фразу, что лучше использовать префиксный, потому что он быстрее, и это было в контексте такой операции:
А>Возник вопрос, а как работают стандартные типы? Как быстрее?

"i++;" и "++i;" — одинаково. Разница возникает в более сложных конструкциях. Например "if( ++i )" бысрее "if( i++ )".
Re[2]: i++ and ++i
От: Аноним  
Дата: 21.04.06 14:29
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>Именно в таком примере, как приводишь ты, компилятор с оптимизатором сгенерирует одинаковый код при использовании как префиксного так и постфиксного инкремента. Но в общем случае, префиксный инкремент быстрее, т.к. он кроме модификации объекта ничего больше не делает. А постфиксный инкремент сначала создает временную копию объекта, потом выполняет ту работу, которую выполняет префиксный инкремент, а потом возвращает ранее сделанную копию.


Копию в памяти... ясно, сенкс.
Эт получается (просьба не закидывать камнями за параноидальную мысль), что на такую операцию может и памяти не хватить?
Но это уже так, риторический вопрос
Re[3]: i++ and ++i
От: rg45 СССР  
Дата: 21.04.06 14:32
Оценка:
" Аноним " <0@users.rsdn.ru> wrote in message news:1861607@news.rsdn.ru...
>
> Копию в памяти... ясно, сенкс.
> Эт получается (просьба не закидывать камнями за параноидальную мысль), что на такую операцию может и памяти не хватить?
> Но это уже так, риторический вопрос

Теоретически — запросто, тем более, что временные объекты создаются в стеке.
Posted via RSDN NNTP Server 2.0
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: i++ and ++i
От: Аноним  
Дата: 21.04.06 15:46
Оценка:
А ещё


int i = MAX;
do{

}while( --i );


быстрее, чем


for (int i = 0; i < MAX; i++)


Несогласным
Re[3]: i++ and ++i
От: achp  
Дата: 21.04.06 16:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>int i = MAX;
А>do{

А>}while( --i );
А>


А>быстрее, чем


А>
А>for (int i = 0; i < MAX; i++)
А>


На практике, если компилятор был выпущен после окончания палеолита, то в случае, когда замена одного другим не меняет производимого кодом эффекта, такая замена производится.
Re[3]: i++ and ++i
От: VoidEx  
Дата: 21.04.06 16:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А ещё



А>
А>int i = MAX;
А>do{

А>}while( --i );
А>


А>быстрее, чем



А>
А>for (int i = 0; i < MAX; i++)
А>


А>Несогласным

А мне больше нравится

for (int i = MAX; --i;) {}

Re[4]: i++ and ++i
От: Roman Odaisky Украина  
Дата: 21.04.06 18:44
Оценка:
Здравствуйте, VoidEx, Вы писали:

А>>А ещё

А>>
int i = MAX;
do{

}while( --i );


А>>быстрее, чем

А>>
for (int i = 0; i < MAX; i++)


Но делает отнюдь не то же самое. Хинт: MAX = 0?

А>>Несогласным

VE>А мне больше нравится

VE>
for (int i = MAX; --i;) {}

VE>

Тоже неправильно. Цикл выполняется MAX — 1, а не MAX раз

Если уж так, то надо
for(int i = MAX; --i >= 0; )
До последнего не верил в пирамиду Лебедева.
Re[5]: i++ and ++i
От: achp  
Дата: 21.04.06 21:20
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>
RO>for(int i = MAX; --i >= 0; )
RO>


Или проще:

for (int i = MAX; i--;)
Re[3]: i++ and ++i
От: Centaur Россия  
Дата: 22.04.06 06:24
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>А ещё


А>
А>int i = MAX;
А>do{

А>}while( --i );
А>


А>быстрее, чем


А>
А>for (int i = 0; i < MAX; i++)
А>


А>Несогласным


Это зависит от того, что делается внутри цикла. Если там последовательный доступ к памяти, то цикл вниз рискует не воспользоваться преимуществами процессорного кэша.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.