Возьмите два следующих фрагмента:
int main()
{
    unsigned long int start = utime();
    __int128_t n = 128;
    for(__int128_t i=1; i<1000000000; i++)
        n = (n * i);
    unsigned long int end = utime();
    cout<<(unsigned long int) n<<endl;
    cout<<end - start<<endl;
}
и
int main()
{
    unsigned long int start = utime();
    __int128_t n = 128;
    for(__int128_t i=1; i<1000000000; i++)
        n = (n * i) >> 2;
    unsigned long int end = utime();
    cout<<(unsigned long int) n<<endl;
    cout<<end - start<<endl;
}
Я сравниваю 128-битные целые числа в С++. При выполнении первого (просто умножение) все работает в ок. 0,95 секунды. Когда я также добавляю операцию сдвига бит (второй фрагмент), время выполнения увеличивается до поразительного 2,49 секунды.
Как это возможно? Я думал, что смещение бит было одной из самых легких операций для процессора. Почему из-за такой простой операции возникает так много накладных расходов? Я компилирую с активированным флагом O3.
Любая идея?

