初めての投稿ですので、皆様のご来店を心よりお待ちしております。私が発生した問題は、コンパイル時のコードの最適化であり、より具体的には、デバッグ印刷の削除です。
syslog logger
ネイティブがあり、次のコードでラップしていると想像してみてください(マクロを使用せずに、非常に重要な注意事項です!)。
enum severity { info_log, debug_log, warning_log, error_log };
template <severity S>
struct flusher {
logger* log_;
flusher(logger* log) : log_(log) {}
flusher(flusher& rhs) : log_(rhs.log_) {}
~flusher() { syslog(S, log_->stream.str()); log_->stream.str(""); }
operator std::ostream& () { return log_->stream; }
};
#ifdef NDEBUG
template <> struct flusher<debug_log> {
flusher(logger*) {}
flusher(flusher&) {}
~flusher() {}
template <typename T> flusher& operator<<(T const&) { return *this; }
};
#endif
struct logger {
std::ostringstream stream;
template <severity T>
flusher<T> operator<<(flusher<T> (*m)(logger&)) { return m(*this); }
};
inline flusher<info_log> info(logger& log) { return flusher<info_log>(&log); }
inline flusher<debug_log> debug(logger& log) { return flusher<debug_log>(&log); }
inline flusher<warning_log> warning(logger& log) { return flusher<warning_log>(&log); }
inline flusher<error_log> error(logger& log) { return flusher<error_log>(&log); }
フラッシャーの空の実装は、コンパイラーがそのような役に立たないコードを削除することを奨励すると思いましたが、両方O2
をO3
使用すると、削除されません。
言及された行動を誘発する可能性はありますか?
前もって感謝します