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

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
inline Short_t TMath::Min(Short_t a, Short_t b)
   { return a <= b ? a : b; }

inline UShort_t TMath::Min(UShort_t a, UShort_t b)
   { return a <= b ? a : b; }

inline Int_t TMath::Min(Int_t a, Int_t b)
   { return a <= b ? a : b; }

inline UInt_t TMath::Min(UInt_t a, UInt_t b)
   { return a <= b ? a : b; }

inline Long_t TMath::Min(Long_t a, Long_t b)
   { return a <= b ? a : b; }

inline ULong_t TMath::Min(ULong_t a, ULong_t b)
   { return a <= b ? a : b; }

inline Long64_t TMath::Min(Long64_t a, Long64_t b)
   { return a <= b ? a : b; }

inline ULong64_t TMath::Min(ULong64_t a, ULong64_t b)
   { return a <= b ? a : b; }

inline Float_t TMath::Min(Float_t a, Float_t b)
   { return a <= b ? a : b; }

inline Double_t TMath::Min(Double_t a, Double_t b)
   { return a <= b ? a : b; }

Поясните плз в чем тут прикол. Почему бы не использовать темплейты?
код из cern/root

Запостил: haib haib, (Updated )

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

      • Как-будто шаблон тебе объектного кода не надублицирует...
        Ответить
            • Я тут решил проверить, действительно ли от инлайна в данном случае бинарь распухает.

              Заинлайненный подсчет максимума занимает 7 байт:
              0x100000fa4 <+4>:  cmpl   %esi, %edi
              0x100000fa6 <+6>:  cmovgel %edi, %esi
              0x100000fa9 <+9>:  movl   %esi, %eax
              0x100000fab <+11>:


              Вызов функции max - примерно 15 байт:
              0x100000f84 <+4>:  movl   $0x4, %edi
              0x100000f89 <+9>:  movl   $0x5, %esi
              0x100000f8e <+14>: popq   %rbp
              0x100000f8f <+15>: jmp    0x100000fa0               ; max(int, int)
              0x100000f94 <+20>:
              Ответить
              • Поэтому конпелятор инлайнит когда хочет, а не когда ты его попросишь. Ему лучше видно, вырастет ли код или сократится.
                Ответить
          • Пидорах, ты уже два раза за тред обосрался. Угомонись.
            Ответить
    • Там, кстати, не только min. Ещё max, range. Выглядят также.
      Шаблоны использовать, кстати, не запрещено. Там рядом есть реализация бинарного поиска и т.д. на шаблонах.
      Ответить
      • А вот это уже интересно... Тут совершенно гладкий код без подводных камней развернули, а более сложный код для поиска доверили разворачивать компилятору? Как-то непоследовательно...
        Ответить
  • Может код автогенерируемый, и либа раскопипащена на разные языки, как OpenGL
    Ответить
  • Крестошаблоны не нужны. Максимум нужна сишка с классами. Царь лучше конпелятора напишет реализацию метода для каждого типа данных.
    Ответить
    • Классы не нужны
      Царь мыслит в битах, а не классах
      Ответить
      • public interface Bit
        {
            public boolean isZero();
            public boolean isOne();
        }
        
        public class Zero implements Bit
        {
            public boolean isZero() { return true; }
            public boolean isOne() { return false; }
        }
        
        public class One implements Bit
        {
            public boolean isZero() { return false; }
            public boolean isOne() { return true; }
        }
        Ответить
        • public interface Bit
          {
              public boolean isZero();
              public boolean isOne();
          }
          
          public class Zero implements Bit
          {
              public boolean isZero() { return !isOne(); }
              public boolean isOne() { return !isZero(); }
          }
          
          public class One implements Bit
          {
              public boolean isZero() { return !isOne(); }
              public boolean isOne() { return !isZero(); }
          }
          Ответить
          • public class Zero implements Bit
            {
                private static Zero _instance;
                public static Zero getInstance() 
                {
                    if (_instance == null) 
                        _instance = new Zero();
                    return _instance;
                }
                public boolean isZero()
                { 
                    return !One.getInstance().isOne();
                }
                public boolean isOne()
                { 
                    return !One.getInstance().isZero(); 
                }
            }
            Ответить
            • Фу, синглтон. Надо через DI заинжектить их друг другу.
              Ответить
            • public class Zero implements Bit
              {
                  private static Zero[] _instance;
                  public static Zero getInstance() 
                  {
                      if (_instance == null) _instance = new Zero[1];
                      if (_instance[0] == null) 
                          _instance[0] = new Zero();
                      return _instance[0];
                  }
                  public boolean isZero()
                  { 
                      return !One.getInstance().isOne();
                  }
                  public boolean isOne()
                  { 
                      return !One.getInstance().isZero(); 
                  }
              }
              Ответить
          • #include <iostream>
            bool one();
            
            bool zero() {
                return !one();
            }
            
            bool one() {
                return !zero();
            }


            Мы же в крестовой ветке всё таки
            Ответить
        • фу гавно. ты хардкодишь что биты могут иметь только два значения.
          Ответить
            • фу гавно. ты хардкодишь что биты в определенный момент времени могут иметь только одно значение.
              Шредингер смотрит на тебя как говно
              Ответить
                • фу гавно. ты хардкодишь отношение двух битов как строго "равно" или "не равно", а ведь они могут быть равны или не равны одновременно
                  Ответить
              • Эх, сейчас я где-нибудь обосрусь.
                class Operator a => Hermitian a where
                
                class Hermitian a => Bit a where
                  isZero :: (Fractional b) => a -> Ѱ -> b
                  isZero a b = 1 - isOne a b
                
                  isOne :: (Fractional b) => a -> Ѱ -> b
                  isOne a b = 1 - isZero a b
                Ответить
                • фу гавно. ты хардкодишь, что сумма вероятностей isOne и isZero равна единице, а ведь бит иногда может быть равен 42...
                  Ответить
                  • Ничего подобного, это дефолтная реализация, которую инстанс может перегрузить.
                    Ответить
                  • Это суперский интерфейс, там внутре должен быть квадрат абсолютного значения.
                    Ответить
                    • Хуйня какая-то получается. Как тогда оператор работать будет? Он же нелинейный получится.
                      Ответить
                      • Bit -- это не сам оператор, а одно из его свойств: грубо говоня, оператор является битом, если у него есть два собственных значения 1 и 0, вероятность которых в некотором состоянии можно получить соотв. функциями.
                        Ответить
                        • Так, может, не надо так мудрить, а надо просто отнаследовать его от Hermitian и Projector?
                          Ответить
                          • Ну правильно по идее просто определить класс с методами, тупо возвращающими собственные векторы нуля и единицы, чтобы юзер с ними делал что угодно, но для них смищные дефолтные реализации не напишешь.
                            Или какие методы в этом классе ты предлагаешь сделать?
                            Ответить
                            • Ну понятно же, что Hermitian должен предоставлять методы для eigendecomposition.
                              Ответить
                              • Классы в haskell -- это всегда сужение общности, они по сути накладывают ограничение на то, какой тип можно подставить в переменные в типе выражения.
                                Например, отличительная особенность бита в том, что значений у него всего два. Следовательно, класс Bit определяет контракт, согласно которому у оператора всего два определённых собственных значения.
                                Ответить
                                • class Operator a where
                                    eigenvalues :: a -> [Complex Double]
                                  
                                  class Operator a => Hermitian a where
                                    eigenvaluesR :: a -> [Double]
                                  
                                  instance Hermitian a => Operator a where -- Без UndecidableInstances не жрёт
                                    eigenvalues = map (:+ 0) . eigenvaluesR
                                  
                                  class Hermitian a => Bit a where
                                  
                                  instance Bit a => Hermitian a where
                                    eigenvaluesR = const [0, 1]
                                  Ответить
                                • Ну вот это и есть проектор же. Всегда два собственных значения - 1 и 0.

                                  Я, кстати, тоже пролажал. Проектор всегда эрмитов.
                                  Ответить
                                  • Говнокод познавательный: наконец загуглил, что такое проектор. Да, ты прав.
                                    Ответить
        • public boolean isOne implements Bat
           {
              return !isZero() {
             isZero();
                 public interface Bat
           {
             public interface Bat
           {
              public interface Bat a where
              public class Voreator a => Bat a b = 1 - isOne implements Bat a where
          
          public class One a b = 1 - isZero() {
             return !zero() { return true; }
           
           class Voream>
           bool one() { retian isZero() { return true; }
                public boolean isOne() {
               public class Shiza implements Bit
           {
           
           public boolean isZero() { return !isOne() { return false; }
          Ответить

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

Помни, guest, за тобой могут следить!

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


    8