c++ - 在指针地址中隐藏数据有什么好处
问题描述
我正在跟踪llvm中错误类的源代码。 http://llvm.org/doxygen/Support_2Error_8h_source.html
从概念上讲,该类应该包含两个重要的数据成员,一个指向 ErrorInfoBase 的指针(Payload)和一个指示是否检查了错误的布尔标志。
但是,布尔标志的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));
}
我想知道为什么不只使用布尔数据成员,并从中设置和获取标志。
将布尔标志存储在指针地址中有什么好处?
解决方案
推荐阅读
- mongoose - 为什么Mongoose会自动为Objects数组中的每个元素创建_id
- php - 如何在 laravel 中按年和月对新闻或帖子进行分组
- r - R - 模拟模型结果
- java - JSF 2.3 整个 bean 验证丢弃了所有字段。是有意的吗?我用错了吗?
- reactjs - React 16.8 hooks => 如何正确地将元素数组注入 DOM
- ajax - Primefaces 按钮不保存输入文本字段值,除非将 ajax 事件放在文本字段中
- node.js - 如何处理 csv 文件中除 utf-8 以外的编码的特殊字符
- c# - C# Linq 如何比较两个字符串并报告第一个不同的字符,它本身不同于'?' 通配符
- python - Python project dependencies with Maven - ModuleNotFoundError: No module named 'xxx'
- kubernetes - 获取上下文的 kubectl 格式输出