LINUX.ORG.RU

История изменений

Исправление SZT, (текущая версия) :

Тут есть и обратная сторона медали. Программист может свои if-ы не от балды расставлять, а в таком порядке, в котором ему кажется что будет оптимальней. Например первый if (a==1) return 22; из примера может стоять первым по причине того, что по мнению программиста это первое условие с большей вероятностью может сработать, т.е значение переменной a, передаваемое в функцию, в 99% случаев будет равнятся именно единице, а не чему-то другому, и такая самодеятельность компилятора, когда он этот код переводит в какие-то непонятные деревья, может все испортить.

Другой интересный пример http://goo.gl/2p8MfN - компилятор clang тут делает очень глупую вещь - два раза cmp вместо очевидного решения:

        cmpl    $100, %edi
        jg      a1
        jne     a2
        jmp     a3
Впрочем, ни один компилятор такой умной оптимизации сделать не может. Вот даже GCC глупости делает на таком коде https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68027

Исходная версия SZT, :

Тут есть и обратная сторона медали. Программист может свои if-ы не от балды расставлять, а в таком порядке, в котором ему кажется что будет оптимальней. Например первый if (a==1) return 22; из примера может стоять первым по причине того, что по мнению программиста это первое условие с большей вероятностью может сработать, т.е значение переменной a, передаваемое в функцию, в 99% случаев будет равнятся именно единице, а не чему-то другому, и такая самодеятельность компилятора, когда он этот код переводит в какие-то непонятные деревья, может все испортить.

Другой интересный пример http://goo.gl/2p8MfN - компилятор clang тут делает очень глупую вещь - два раза cmp вместо очевидного решения:

        cmpl    $100, %edi
        jg      a1
        jne     a2
        jmp     a3
Впрочем, не один компилятор такой умной оптимизации сделать не может. Вот даже GCC глупости делает на таком коде https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68027