作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发布了this回答。代码:
#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)
部分,因为它无法在调用之间进行更改。 Turns out不过,大多数编译器都会内联函数调用 unchecked_log::operator<<
但不要优化分支。有什么东西阻止了这种优化吗?会不会违法啊。
最佳答案
LOG
是具有外部链接的全局变量。因此printImpl
另一个翻译单元中的定义可以到达它并可能修改 LOG.ulog.active
通话之间。
制造LOG
test
中的局部变量重复检查将在test
条目处合并为一次。或离开LOG
它在哪里并让它static
,因此包含 printImpl
的不同编译单元的定义无法到达此翻译单元的实例。
正如下面的评论中提到的,或者让 operator<<
通过复制返回,因此它返回的实例(现在是临时的)对于 printImpl
是无法访问的.
请注意 private
的可访问性( ulog
等)和ulog.active
不要紧。一旦printImpl
能够获取相关实例的指针或引用,private
无论如何都不能防止修改。以下是一些如何实现这一点的示例(非详尽):
operator<<
上LOG
现在可能会改变 LOG.ulog.active
基于 printLog
的干预修改或通过 const_cast
计算结果reinterpret_cast
LOG
对其 ulog
的引用成员(member)memcpy
不同的状态进入LOG
Log
的新实例进入LOG
,这将使先前的引用自动引用新对象,因为 Log
满足条件关于c++ - 这是否是一个错过的优化机会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59291618/
我无法在附加行中显示“真”、“假”、"is"和“否”按钮。 我在这里有一个应用程序:Application 请按照以下步骤使用应用程序: 1。当你打开应用程序时,你会看到一个绿色的加号按钮,点击 在此
我是一名优秀的程序员,十分优秀!