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

    −19

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 04 Февраля 2017

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

    • http://en.cppreference.com/w/cpp/types/numeric_limits
      Ответить
    • Прикол в программистах.
      Ответить
    • Цернский пирфоманс.
      Ответить
      • дубликация объектного кода
        Ответить
        • Как-будто шаблон тебе объектного кода не надублицирует...
          Ответить
          • у шаблона одна копия а у инлайна на каждый вызов
            Ответить
            • Шо тут заинлайнится, шо там. Одна хуйня.
              Ответить
              • Я тут решил проверить, действительно ли от инлайна в данном случае бинарь распухает.

                Заинлайненный подсчет максимума занимает 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. Выглядят также.
        Шаблоны использовать, кстати, не запрещено. Там рядом есть реализация бинарного поиска и т.д. на шаблонах.
        Ответить
        • А вот это уже интересно... Тут совершенно гладкий код без подводных камней развернули, а более сложный код для поиска доверили разворачивать компилятору? Как-то непоследовательно...
          Ответить
    • Потому что шаблоны говно, вот почему!
      Ответить
    • TPAXHY_B_AHYC
      Ответить
    • Может код автогенерируемый, и либа раскопипащена на разные языки, как 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();
              }


              Мы же в крестовой ветке всё таки
              Ответить
          • фу гавно. ты хардкодишь что биты могут иметь только два значения.
            Ответить
            • Да, неудачный интерфейс получился.
              Ответить
              • фу гавно. ты хардкодишь что биты в определенный момент времени могут иметь только одно значение.
                Шредингер смотрит на тебя как говно
                Ответить
                • public interface Bit {
                      public boolean equals(Bit other);
                  }
                  Ответить
                  • фу гавно. ты хардкодишь отношение двух битов как строго "равно" или "не равно", а ведь они могут быть равны или не равны одновременно
                    Ответить
                • Эх, сейчас я где-нибудь обосрусь.
                  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...
                    Ответить
                    • Ничего подобного, это дефолтная реализация, которую инстанс может перегрузить.
                      Ответить
                  • Если Hermitian, то Complex, не?
                    Ответить
                    • Это суперский интерфейс, там внутре должен быть квадрат абсолютного значения.
                      Ответить
                      • Хуйня какая-то получается. Как тогда оператор работать будет? Он же нелинейный получится.
                        Ответить
                        • 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; }
            Ответить
    • cern у себя использует интерпретатор С++, вот он https://en.wikipedia.org/wiki/CINT
      когда-то давно он не умел в шаблоны
      Ответить

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