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

0

  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 mvngr, (Updated )

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

      • Почему? Простое уничтожение старого объекта и создание нового ня его месте. И деструктор, и конструктор исключений ня бросают, так что метод безопасный.
        Вся эта либа ориентированя ня максимальную производительнясть, так что ничего удивительного, что они используют такую низроуровнявую функционяльность.
        Ответить
        • Я бы сделал метод clear, его бы вызывал с деструктора и с этого метода. Компилятор всё равно это заинлайнит.
          Ответить
          • Тогда уж "destroy()". Обычный "clear()" выглядит как простая безопасная очистка, а у них в деструкторе опасная лоулевельная нягия происходит. Но особой разницы всё равно нят: это глубокие кишки реализации, и если ты достаточня поехавший, чтобы их понямать, то явный вызов деструктора тебя явно ня смутит.
            Ответить
          • Да, и есть ещё один важный момент: с явным вызовом деструктора становится явня видня, что placement new ня this звать безопасня. А если там просто будет какой-то метод, после которого реюзается хранилище под this — будет выглядеть как потенциальня очень неприятная ошибка.
            Ответить
              • У них там 39 конструкторов со сложной логикой. Placement new позволяет реализовать производительный код без няобходимости в няписании ещё тридцати девяти перегрузок "construct()". Более того, подход с placement new гарантирует, что они корректня освобождают и конструируют все няобходимые ресурсы. Подход с "clear()-construct()" тоже может иметь такую же эффективнясть, но будет сложнее, более громоздким и более хрупким.
                Ответить
      • Если ты сам начинаешь выбирать где хранить объект, то и копулятор уже за него не отвечает.
        Так работают некоторые контейнеры, например
        Так что всё вроде логично
        Ответить
      • тут вроде placement new (new (this)) а он сам деструктор звать не умеет
        Ответить
    • Почему в первой строке однострочный комментарий, а во второй многострочный?
      Зачем восклицательный знак?
      Ответить
    • > this->~

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

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

Где здесь C++, guest?!

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


    8