我正在llvm中跟踪Error类的源代码。 http://llvm.org/doxygen/Support_2Error_8h_source.html
从概念上讲,该类应包含两个重要的数据成员,一个指向ErrorInfoBase的指针(有效负载)和一个布尔标志,指示是否已检查错误。
但是,布尔标志的getter和setter的实际实现将标志隐藏在指针Payload中。
bool getChecked() const {
return (reinterpret_cast<uintptr_t>(Payload) & 0x1) == 0;
}
void setChecked(bool V) {
Payload = reinterpret_cast<ErrorInfoBase*>(
(reinterpret_cast<uintptr_t>(Payload) &
~static_cast<uintptr_t>(0x1)) |
(V ? 0 : 1));
}
我想知道为什么不只使用布尔数据成员,并从中设置和获取标志。
将布尔标志存储在指针的地址中有什么好处?