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

    +10

    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
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    align.h: 
    #pragma once
    #include "stdint.h"
    namespace tblib 
    {
      template <typename T>
      struct check_align
      {
        uint8_t c;
        T t;
        check_align();
        check_align(const check_align&);
        check_align&operator=(const check_align&);
      };
    
      template <typename T>
      struct align_value
      {
        enum { value = sizeof(check_align<T>)-sizeof(T) };
      };
    
      template <int N>
      struct align_by_size;
    
      template <> 
      struct align_by_size<1> { uint8_t guts; };
    
      template <> 
      struct align_by_size<2> { uint16_t  guts; };
    
      template <> 
      struct align_by_size<4> { uint32_t guts; };
    
      template <> 
      struct align_by_size<8> { uint64_t guts; };
    
      template <typename T>
      struct align
      {
        align_by_size<align_value<T>::value> guts;
      };
    };
     класс массива (начало), файл tbarr.h: 
    #pragma once
    
    #include "stdint.h"
    #include "assert.h"
    #include <algorithm>
    #include "tbslice.h"
    #include "align.h"
    
    // FUCK THE EXCEPTIONS
    
    template <typename T>
    void construct (T* first, T* last) {
      while (first!=last)  {
        new(first) T;
        ++first;
      }
    }
    
    template <typename T>
    void destroy (T* first, T* last)  {
      while (last!=first)  {
        --last;
        last->~T();
      }
    }
    
    namespace tblib
    {  
      template <typename T, int N>
      class base_array
      {
        union
        {
          uint8_t memory [sizeof(T[N])];
          align<T> aligner;
        };
      public :

    мой выравниватель
    намного красивее бустовского, не так ли?

    Запостил: TarasB, 27 Января 2014

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

    • FUCK THE EXCEPTIONS
      Сколько сарказма и экспрессии в этом зеленом комментарии...
      http://www.youtube.com/watch?v=iYWzMvlj2RQ
      Ответить
      • Я не знаю кроссплатформенный макрос, определяющий, есть ли исключения.
        Ответить
        • тот который ты сам написал или взял из буста
          Ответить
        • В сборочном скрипте пытаешься собрать простенькую прогу с try .. catch с текущими флагами компилятора, если она не собирается - добавляешь к флагам дефайн TB_NO_EXCEPTIONS. Как-то так ;)
          Ответить
          • А вообще - вроде как пишут, что в вижуалке можно отключить тормозной SEH и тем самым получить zero-overhead exceptions как в g++, не отключая поддержку исключений.
            Ответить
            • Я исключения выключаю ради того, чтобы не разбираться с неявными выходами.
              Ответить
              • Ну не разбирайся, кто заставляет, прога просто крашнется от необработанного исключения и все. С отключенными исключениями она сделает ровно то же самое.
                Ответить
                • Да, но некоторые кукарекают исключениями на вполне штатные ситуации, тем самым навязывая их обработку. В моей проге такой хуйни нету.
                  Ответить
                  • > некоторые кукарекают исключениями на вполне штатные ситуации
                    Да в std вроде не было такого... Можно пример?
                    Ответить
                    • В std нету, да. И у меня нету. Поэтому я забиваю на этот случай и пишу, что мои массивы с исключениями нихуя не дружат.
                      Ответить
                      • > нихуя не дружат
                        Неправда. Они у тебя не дружат только с исключениями в конструкторах хранимых в них объектов.
                        Ответить
                        • Да. Конструкторах, конструкторах копирования, операторах приравнивания.
                          Вопрос, хули в них вообще делают исключения - это отдельный вопрос.

                          И ни одна прога даже последней привокзальной траебляди не дружит с исключениями в деструкторах)
                          Ответить
                          • > исключениями в деструкторах
                            Потому что если возникло исключение в деструкторе во время раскрутки стека - у рантайма просто не остается вменяемых вариантов, помимо суицида.
                            Ответить
                            • у кресторантайма. В D вот все в порядке с этим.
                              Ответить
                              • И что он делает после исключения в деструкторе, вызванном раскруткой стека из-за другого исключения?
                                Ответить
                                • Передает дальше оба исключения списком.
                                  Ответить
                                  • Т.е. просто собирает все возникшие по дороге исключения в список?

                                    А как это потом ловится? Тупо за основное исключение, а остальные можно извлечь из него?
                                    Ответить
              • > Я исключения выключаю ради того, чтобы не разбираться с неявными выходами.

                А я уже без RAII не хочу ничего писать. Всегда оборачиваю примитивы ОС и библиотек в несложные обертки, преобразую все возвращаемые коды в исключения - не даю себе расслабиться и проигнорировать любую, даже мелкую ошибку. Это все в дополнение к избавлению от страха утечек памяти :)
                ________________________________________ ________________________________________ ________________________
                — Кто проверяет указатели на ноль...
                — ...тот трус!
                //из разговора двух коллег
                Ответить
                • > А я уже без RAII не хочу ничего писать.
                  Я тоже, а причём тут исключения?
                  Ответить
                  • > > А я уже без RAII не хочу ничего писать.
                    > Я тоже, а причём тут исключения?
                    Они друг друга так дополняют, что практически связались для меня в одно целое.
                    Ответить
                • Дык RAII просто дает exception safety, а бросать и ловить исключения никто не заставляет ;)
                  Ответить
    • > класс массива (начало)
      приквел для прошлого говнокода?
      Ответить
    • Ещё это, а компилятор не выпилит не используемое нигде поле, похерив выравнивание?
      Ответить
      • > не используемое нигде поле
        Не, всяко не удалит.
        Ответить
    • Читал давно (а перечитывать лень), но хорошо про выравниватели вроде было написано здесь:
      http://akrzemi1.wordpress.com/2012/12/13/constexpr-unions/
      Ответить

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