префиксные и постфиксный ++ от яндекс практикума

на сколько корректно выражение

Инкременты и декременты бывают также постфиксные. Префиксные меняют значения переменных до обработки компилятором, а постфиксные — после. Поэтому префиксные более производительны.

меня смущает фраза до отработки компилятором. и правда ли префиксный быстрее? хорошо бы на стандарт. я посмотрел под диз асемблером в циклах код один в один. При присвоении переменной на одну ассемблерную команду больше. Зависит ли это от опций компилятора ?


Ответы (1 шт):

Автор решения: Harry

Понимаете, тут не хватает "в общем случае".

Что толку в сравнении выражений ++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 для хранения?

А если это какой-то пользовательский класс?..

→ Ссылка