Это упущенная возможность оптимизации или нет - PullRequest
3 голосов
/ 11 декабря 2019

Я отправил этот ответ. Код:

#include <atomic>
#include <utility>
void printImpl(...);

std::atomic<bool> printLog = false;

class Log {
 public:
  template <typename T>
  const auto& operator<<(T&& t) {
    if (printLog) {
      ulog.active = true;
      return ulog << std::forward<T>(t);
    } else {
      ulog.active = false;
      return ulog;
    }
  }

 private:
  struct unchecked_log {
    template <typename T>
    const auto& operator<<(T&& t) const {
      if (active) {
        printImpl(std::forward<T>(t));
      }
      return *this;
    }
    bool active{false};
  };
  unchecked_log ulog{};
};

// Instead of the macro. Doesn't break backward compatibility
Log LOG;

void test(bool) { LOG << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10; }

По сути, код либо игнорирует, либо регистрирует все данные. Идея заключалась в том, чтобы записать atomic<bool> в обычном bool, который можно оптимизировать проще. Я думал, что большинство компиляторов могут легко оптимизировать часть if (active), так как она не может переключаться между вызовами. Получается , хотя большинство компиляторов встраивают вызов функции в unchecked_log::operator<<, но не оптимизируют ветвление. Что-то мешает этой оптимизации? Будет ли это незаконно.

...