префиксные и постфиксный ++ от яндекс практикума
на сколько корректно выражение
Инкременты и декременты бывают также постфиксные. Префиксные меняют значения переменных до обработки компилятором, а постфиксные — после. Поэтому префиксные более производительны.
меня смущает фраза до отработки компилятором. и правда ли префиксный быстрее? хорошо бы на стандарт. я посмотрел под диз асемблером в циклах код один в один. При присвоении переменной на одну ассемблерную команду больше. Зависит ли это от опций компилятора ?
Ответы (1 шт):
Понимаете, тут не хватает "в общем случае".
Что толку в сравнении выражений ++i и i++ для простого int? Где само значение выражения не используется, так что весь эффект - только в увеличении переменной на 1...
А если это что-то посерьезнее, то префиксный просто увеличивает значение, а вот постфиксный должен еще и старое значение сохранить, а потом вернуть. Чувствуете разницу? :)
Вот - как пример - даже для простого int без оптимизации VC++ обрабатывает по-разному:
; 15 : cout << ++i;
mov ecx, DWORD PTR _i$[ebp]
add ecx, 1
mov DWORD PTR _i$[ebp], ecx
mov edx, DWORD PTR _i$[ebp]
push edx
mov ecx, OFFSET ?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::cout
call ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z ; std::basic_ostream<char,std::char_traits<char> >::operator<<
; 16 : cout << i++;
mov eax, DWORD PTR _i$[ebp]
mov DWORD PTR tv72[ebp], eax
mov ecx, DWORD PTR _i$[ebp]
add ecx, 1
mov DWORD PTR _i$[ebp], ecx
mov edx, DWORD PTR tv72[ebp]
push edx
mov ecx, OFFSET ?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::cout
call ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z ; std::basic_ostream<char,std::char_traits<char> >::operator<<
Видите - временную переменную tv для хранения?
А если это какой-то пользовательский класс?..