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

    +5

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    ostringstream s;
    
    ...
    
    -    return s.str();
    +    return std::move(s.str());

    соптимизировано

    Запостил: kurwa, 02 Июля 2016

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

    • Последние две строчки - это кусок дифа, если что.
      Ответить
    • Где оптимизация?
      Ответить
    • Я правило понял, что если эта функция возвращает string, то эта оптимизация до жопы?
      Ответить
      • Там std::move до жопы. s.str() и так возвращает временный объект.
        Ну и вообще std::move в return практически никогда ничего не оптимизирует - в лучшем случае это no-op, а в худшем еще и RVO ломает (т.е. делает медленнее).
        Ответить
    • return std::move(std::move(s.str());)

      Двойная оптимизация.

      Можно расширить на любой уровень оптимизации:
      template <size_t optimization_depth, typename T>
      T&& optimized_return(T& value)
      {
          return std::move(optimized_return<optimization_depth - 1>(value));
      }
      
      template <typename T>
      T&& optimized_return<1>(T& value)
      {
          return std::move(value);
      }


      Говорят, что return optimized_return<numeric_limits<size_t>: :max()>(s.str()); выполняется за отрицательное время.
      Ответить
      • Но нарушение причинности в крестах - UB, поэтому так делать не надо.
        Ответить
        • Стандарт ничего не говорит про нарушение причинности юзером, но прямо разрешает нарушать её компилятору в случае UB.
          Ответить
        • Че за причинность?
          Ответить

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