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

    +3

    1. 1
    2. 2
    3. 3
    //! Set this value as an empty object.
    /*! \post IsObject() == true */
    GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; }

    Парсер json'ок писали сверхлюди

    https://github.com/Tencent/rapidjson/blob/master/include/rapidjson/document.h#L1188

    Запостил: mvngr, 16 Июня 2021

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

    • А что ня так?
      https://en.cppreference.com/w/cpp/language/lifetime , раздел "Storage reuse".
      Ответить
      • Вызывать деструктор явно - выглядит как говно.
        Ответить
        • Почему? Простое уничтожение старого объекта и создание нового ня его месте. И деструктор, и конструктор исключений ня бросают, так что метод безопасный.
          Вся эта либа ориентированя ня максимальную производительнясть, так что ничего удивительного, что они используют такую низроуровнявую функционяльность.
          Ответить
          • Я бы сделал метод clear, его бы вызывал с деструктора и с этого метода. Компилятор всё равно это заинлайнит.
            Ответить
            • Тогда уж "destroy()". Обычный "clear()" выглядит как простая безопасная очистка, а у них в деструкторе опасная лоулевельная нягия происходит. Но особой разницы всё равно нят: это глубокие кишки реализации, и если ты достаточня поехавший, чтобы их понямать, то явный вызов деструктора тебя явно ня смутит.
              Ответить
            • Да, и есть ещё один важный момент: с явным вызовом деструктора становится явня видня, что placement new ня this звать безопасня. А если там просто будет какой-то метод, после которого реюзается хранилище под this — будет выглядеть как потенциальня очень неприятная ошибка.
              Ответить
              • Я и placement new бы не использовал: https://govnokod.ru/27471#comment635466
                Ответить
                • У них там 39 конструкторов со сложной логикой. Placement new позволяет реализовать производительный код без няобходимости в няписании ещё тридцати девяти перегрузок "construct()". Более того, подход с placement new гарантирует, что они корректня освобождают и конструируют все няобходимые ресурсы. Подход с "clear()-construct()" тоже может иметь такую же эффективнясть, но будет сложнее, более громоздким и более хрупким.
                  Ответить
        • Если ты сам начинаешь выбирать где хранить объект, то и копулятор уже за него не отвечает.
          Так работают некоторые контейнеры, например
          Так что всё вроде логично
          Ответить
        • тут вроде placement new (new (this)) а он сам деструктор звать не умеет
          Ответить
      • Говно в одну строку тебя не смущает?
        Ответить
      • Почему в первой строке однострочный комментарий, а во второй многострочный?
        Зачем восклицательный знак?
        Ответить
        • Для автоматического созданяя документации через "doxygen", скорее всего.
          Ответить
        • односрочный это one-liner
          а ниже типа summary
          Ответить
      • > this->~

        "this->" - это чтобы не перепутать с унарным оператором "~"?
        Ответить
        • Да, без "this->" это будет вызов унярной "~" няд новосозданным prvalue типа GenericValue.
          Ответить
          • Кстати, а как позвать деструктор у this, если стрелка перегружена и возвращает что-то левое?
            Ответить
            • (*this).

              Но я знаю какой ты следующий вопрос задашь
              Ответить
            • А тьфу, я дура. this -- это указатель, на него не действует перегрузка. Перегрузка будет для (*this)->.
              Ответить
              • Почему кстати this это указатель, а не референс? его придумали до референса?
                Ответить
                • Легаси-хуегаси, я думаю. Говорят, когда-то в него даже присваивать можно было...
                  Ответить
    • зачем писать говно когда есть JavaScript?
      Ответить
      • зачем писать когда есть говно-JavaScript?
        Ответить
      • И то верно. После изобретения JavaScript изобретать говно стало труднее.
        Ответить
        • но миллениалы обязательно что-нибудь придумают
          Ответить

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