Кресты / Говнокод #11294 Ссылка на оригинал

0

  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 TarasB, (Updated )

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

  • Рискну предположить - для того, чтобы вызвать перегруженные операторы + / * -. Очевидно без этого он бы вызывал арифметические функции с приведением типов к чему-нибудь типа int. *scratches head*
    Ответить
  • используя бинарные операторы +-/*, из-за лени, за счет оверхеда, объявить и +=, -=, *=, /=
    получается эквивалентно Fixed tmp(this->operator + (a)); return this->operator = (tmp);
    далее работает оптимизатор
    второй return *this; в каждом не нужен, естесно
    Ответить
      • Это для надежности, вдруг первый 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
          Ответить
        • Хм, а разве в ней есть работа с мелкими fixed'ами, так нужными геймдевовцам? GMP она скорее для математиков и криптографов.
          Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8