1. C++ / Говнокод #11294

    −32

    1. 1
    2. 2
    3. 3
    4. 4
    Fixed& operator +=(Fixed a) { return *this = *this + a; return *this; }
    Fixed& operator -=(Fixed a) { return *this = *this - a; return *this; }
    Fixed& operator *=(Fixed a) { return *this = *this * a; return *this; }
    Fixed& operator /=(Fixed a) { return *this = *this / a; return *this; }

    http://wiki.yak.net/675/fixed.h
    посоны, зачем так сделано?

    Запостил: TarasB, 25 Июня 2012

    Комментарии (17) RSS

    • Рискну предположить - для того, чтобы вызвать перегруженные операторы + / * -. Очевидно без этого он бы вызывал арифметические функции с приведением типов к чему-нибудь типа int. *scratches head*
      Ответить
    • используя бинарные операторы +-/*, из-за лени, за счет оверхеда, объявить и +=, -=, *=, /=
      получается эквивалентно Fixed tmp(this->operator + (a)); return this->operator = (tmp);
      далее работает оптимизатор
      второй return *this; в каждом не нужен, естесно
      Ответить
      • Ой, второй return я и не заметил...
        Ответить
        • Это для надежности, вдруг первый return не сработает.
          Ответить
      • Да вот меня компилятор оплевал предупреждениями из-за этой библиотеки.
        Ответить
        • я смотрю, ты разбираешься в сортах говна

          передавай const & в параметры, пожалуйста
          Ответить
          • Там еще вот такое чудо нашлось:
            Fixed(int a) : g( a << BP ) {}
            Fixed(long a) : g( a << BP ) {}
            Fixed& operator +=(Fixed a) { return *this = *this + a; return *this; }
            Fixed& operator +=(int a) { return *this = *this + (Fixed)a; return *this; }
            Fixed& operator +=(long a) { return *this = *this + (Fixed)a; return *this; }
            Ответить
      • Вот что странно - низкоуровневый класс, который, видимо, будет юзаться очень часто (не просто так же мы решили использовать fixed point арифметику). Вот уж где, казалось бы, простор для байтоебства и оптимизаций... Но нет. Мы видим типичный индусский код с двумя ретурнами и лишней временной переменной. Остается только надеяться на качественный компилятор.
        Ответить
        • Там ещё и фиксированное умножение меня смущает. Что оно сделано через long long int. Компилятор умеет это воспринимать как один mul, а не два?
          Ответить
          • В некоторых случаях - вполне. Я когда-то тут приводил пример:
            uint64_t x = a;
            uint64_t y = b;
            uint64_t r = x*y;
            uint32_t high = (r >> 32) & 0xFFFFFFFF;
            uint32_t low = r & 0xFFFFFFFF;

            Вот нечто подобное этой конструкции gсс превращал в один mul.
            Ответить
          • g++ выдало примерно такое:
            ; переменные загружены в edx и eax
            imull   (%edx)
            shrdl   $16, %edx, %eax
            ret
            Ответить
        • дык к гцц прикладывается ведь библиотека для как раз такого байтоёбства - http://gmplib.org/
          Ответить
          • Хм, а разве в ней есть работа с мелкими fixed'ами, так нужными геймдевовцам? GMP она скорее для математиков и криптографов.
            Ответить
    • Тарас, что же ты это не запостил...
      int g; // the guts
      Ответить
    • показать все, что скрытоХерня
      Ответить

    Добавить комментарий