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

    0

    1. 1
    2. 2
    3. 3
    4. 4
    #define MIRAGE_COFU(T, name, ...) \
             inline struct _##name##cofu { T instance{ __VA_ARGS__ }; T& operator()(void) { return instance; }; \
             static bool destructed; ~_##name##cofu(void) { destructed = true; } static bool isDestructed(void) \
             { return destructed; } } name; inline bool _##name##cofu::destructed = false

    кофу

    Запостил: kcalbCube, 01 Июня 2022

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

    • не кофу.
      вот кофу
      #define MIRAGE_COFU(T, name, ...) \
               inline struct _##name##cofu { T* instance = nullptr; T& operator()(void) { if(!instance) instance = new T(__VA_ARGS__); \
               return *instance; }; static bool destructed; ~_##name##cofu(void) { destructed = true; if(instance) delete instance;} \
               static bool isDestructed(void) { return destructed; } } name; inline bool _##name##cofu::destructed = false
      Ответить
      • if (...) {
          MIRAGE_COFU(CSvinia, svinia)
          ...
          svinia()->eat(acorns);
          svinia()->eat(baby);
          svinia()->eat(shit);
          // and dies
        }
        Ответить
        • А зачем isDestructed?

          Кстати, интересно, а если бы isDestructed не было static, не было бы UB проверять это поле после деструктора?
          Ответить
          • вызов метода после деструктора конечно UB
            Ответить
        • эт для глобал скопа
          Ответить
          • ааа
            Create On First Usage

            PigSty::~PigSty()
            {
              if (!m_svinia.isDestructed()) {
                // Потому что порядок вызова деструкторов неизвестен
                log("Svinia byla escho zhiva, kogda na nee upala krysha svinarnika");
                m_svinia.screech();
              } else {
                log("Trup svinii zavalilo");
              }
            }
            Ответить
            • Порядок вызова деструкторов обратен порядку декларации полей.
              Сначала у тебя дуба двинет твое поле, а потом и ты сам. На момент вызова твоего деструктора свыня уже будет мертва (конечно если это настоящая свинья, а не ссылка)

              Что такое is_destructed? Это что-то по-жабьи?
              https://github.com/JetBrains/intellij-community/blob/3a0b4245b617f6d9842a1b0c402709e1083501f6/platform/util/src/com/intellij/openapi/util/Disposer.java#L179
              Ответить
              • Да, попутал. Читать "g_svinia" (ну или да, &m_svinia = g_svinia).
                Ответить
                • Да, я сытая свинья
                  Просто сытая свинья.
                  Я в грязной луже лежу,
                  Но ты не трогай меня,
                  Ведь эта лужа моя

                  >&m_svinia = g_svinia
                  вот тут немного не понял
                  Ответить
                  • "(конечно если это настоящая свинья, а не ссылка)"

                    Вот про это.

                    MIRAGE_COFU(CSvinia, g_svinia);
                    
                    class PigSty {
                      PigSty(); ~PigSty();
                      auto &m_svinia = g_svinia;
                    };


                    Иначе проверка на isDestructed не имеет смысла, все определено:
                    class PigSty {
                      PigSty(); ~PigSty();
                      MIRAGE_COFU(CSvinia, m_svinia);
                    };
                    Ответить
                    • а, так "&m_svinia" это "auto& m_svinia", то есть автоматического типа ссылка?

                      Я просто не понял (ты же не написал auto!) и я подумал, что это какой-то новый синтаксис присваивания или взятия чего-то, хуй знает чего


                      Кстати, питухи, кто как пишет:
                      ``petuz* foo`` vs ``petuh *foo`` ?
                      Ответить
              • Сейчас перечитал абзац - это как? Разве поля разрушаются не после деструктора?
                class PigSty 
                {
                  Svinia m_svinia;
                  ~PigSty() { m_svinia.write_testament(); }
                };
                Ответить
                • Сначала вызывается деструктор, после его завершения — разрушаются поля в порядке, обратным созданию.

                  А вообще, если пара имён этой хуйни совпадёт в многопоточном приложении, весело будет. Как минимум, гонки с модификацией статического поля.
                  Ответить
                • да, именно так
                  The body of an object’s destructor is executed, followed by the destructors of the object’s data members

                  говнокод -- опасное место, никому доверять нельзщя
                  Ответить
              • Заметьте кстати, что если любую чушь сказать с достаточно авторитетным видом, то твои собеседники тебе поверят, даже если будут знать, что ты пиздишь.

                Стив отлично знал в каком порядке вызываются десктруторы в С++, но всё равно стушевался

                Часто этот хак использую.
                Ответить
                • ты хуйню спизданул
                  Ответить
                  • Ну теперь-то ты уже знаешь, что я несу хуйню, так что эксперемент не честный
                    Ответить
                • > достаточно авторитетным видом
                  > guest6

                  Два несовместимых понятия.
                  Ответить
                  • На КГ бОльшая часть комментов написана от моего имени
                    Ответить
                    • *большая часть хуйни
                      ftfy

                      Хотя это спорно. Если брать удалённые комменты, то 100% нет. Если объединить файки местных блаженных — тоже.
                      Ответить
                      • >хуйни
                        Это совершенно не важно. Хуйню тоже читают, и даже пытаются с ней дискутировать, как мы только что выше и увидели.

                        Удалённые комменты никого не интересует, как и стерторовый понос.

                        Кто-то (1024?) делал статистику, и там было отчетливо видно, что на первом месте guest. А на втором внезапно был Борманд что-ли..
                        Ответить
                      • Какой грубай GROUP BY %%%
                        Ответить
                        • говоришь, ничего не случится
                          если буду немного GRUB
                          Ответить
                    • > КГ
                      Ковногод?
                      Ответить
    • Тофу
      Ответить
      • Тофу это такой соевый продукт, очень полезный
        Ответить
        • Ня ^-^
          Ответить
        • Soylent /green
          Ответить
          • Soylent Green is a 1973 American ecological dystopian thriller film directed by Richard Fleischer, and starring Charlton Heston, Leigh Taylor-Young and Edward G. Robinson in his final film role. Loosely based on the 1966 science fiction novel Make Room! Make Room! by Harry Harrison, the film combines police procedural and science fiction genres, the investigation into the murder of a wealthy businessman and a dystopian future of dying oceans and year-round humidity, due to the greenhouse effect, resulting in pollution, poverty, overpopulation, euthanasia and depleted resources. In 1973, it won the Nebula Award for Best Dramatic Presentation and the Saturn Award for Best Science Fiction Film.
            Ответить
        • Несомненно, соя и продукты на ее основе очень полезны.
          Привет, ГМО.
          Ответить

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