用指针低三位存放额外信息的优化方法

在8字节对齐的情况下指针的低三位都是0,在某些情况下我们需要维持跟指针对应的额外信息,例如标志位,但是又不想为此创建一个结构体,那就可以利用指针的低三位来存储额外信息。

一种用指针低三位存放额外信息的优化方法

在8字节对齐的情况下指针的低三位都是0,在某些情况下我们需要维持跟指针对应的额外信息,例如标志位,但是又不想为此创建一个结构体,那就可以利用指针的低三位来存储额外信息。

比如说我们希望原子操作的类型是64位的数据,这样可以利用CMPXCHG机器指令实现CAS操作,即我们希望定义 std::atomic<t *></t>的变量实现原子操作,而不希望定义 std::atomic,S为某个结构体。这时候就可以应用上述技巧。

具体实现方式如下所示:

std::uintptr_t是定义一个可以表示地址值(指针值即地址值)的无符号整型。将指针转换成 std::uintptr_t然后进行位运算。以下代码作为示例:

#include
#include

struct Data
{
    // 定义一些数据成员
    long int a;
    long int b;
    long int c;
};

// 定义三个标志位,不用细究三个标志位的具体含义,这个在这里不重要。
static constexpr std::uintptr_t HAS_DATA = 1;
static constexpr std::uintptr_t NEED_DATA = 2;
static constexpr std::uintptr_t CLOSED = 4;
static constexpr std::uintptr_t FLAGS_MASK = HAS_DATA | NEED_DATA | CLOSED;
static constexpr std::uintptr_t PTR_MASK = ~FLAGS_MASK;

int main()
{
    Data * dp = new Data();
    dp->a = 88;
    dp->b = 99;
    dp->c = 77;

    std::cout << "指针值为 " << std::hex << reinterpret_cast(dp) << std::endl;
    // 在指针上附加上标志位
    std::uintptr_t ptr_int = reinterpret_cast(dp) | HAS_DATA;
    std::cout << "加过标记位后 " << std::hex << ptr_int << std::endl;

    // 取标志位
    std::uintptr_t flags = ptr_int & FLAGS_MASK;
    std::cout << "标记位 " << flags << std::endl;

    // 需要用指针的时候,清零低三位,恢复指针值原来的值
    dp = reinterpret_cast(ptr_int & PTR_MASK);
    std::cout << "使用恢复后的指针" << std::dec << dp->a << ", " << dp->b << ", " << dp->c << std::endl;
    return 0;
}

Original: https://www.cnblogs.com/chengxin1985/p/16211842.html
Author: 程鑫
Title: 用指针低三位存放额外信息的优化方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/710796/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 响应式布局

    1 什么是媒体查询 ¶ 媒体查询指的是获取设备屏幕、浏览器尺寸(width,height),进而为不同尺寸设定不同的CSS样式。一般而言,可以通过@media来获取屏幕或浏览器尺寸…

    技术杂谈 2023年7月23日
    069
  • 盘点飞思卡尔i.MX多媒体处理器前世今生 (转)

    现如今,移动处理器领域,大家关注最多的是德州仪器、高通、展讯、MTK,甚至包括Intel,但是请别忘记飞思卡尔,他的i.MX处理器已经发展到第六代。那么我们今天就来盘点下i.MX的…

    技术杂谈 2023年7月11日
    071
  • Redis-firewall使用命令

    Redis-firewall使用命令 一、iptables防火墙 1、基本操作 查看防火墙状态 service iptables status 停止防火墙 service ipta…

    技术杂谈 2023年6月21日
    082
  • PYQT5学习(13):QMidArea同时显示多个窗口,创建多个独立的窗口

    QMidArea 参考文章:https://blog.csdn.net/jia666666/article/details/81670569 一种同时显示多个窗口的方法,创建多个独…

    技术杂谈 2023年7月24日
    064
  • 问题开发

    1.路由协议 2.snmpv2 v3 发展异同 ?原因 解决什么问题 Original: https://www.cnblogs.com/hshy/p/16539009.htmlA…

    技术杂谈 2023年5月31日
    0119
  • UnixBench算分介绍【转】

    关于如何用UnixBench,介绍文章很多,这里就不展开了。这里重点描述下它是如何算分的。 碰到很多客户,装好后,直接./Run,就把结果跑出来了,然后还只取最后一个分值,比谁高谁…

    技术杂谈 2023年5月31日
    0105
  • Springboot logback.xml配置详解

    介绍 之前博文有专门介绍过基于Log4j Appender 实现大数据平台组件日志的采集, 本篇主要对java项目中经常会接触到的logback.xml文件的配置做一个介绍和总结….

    技术杂谈 2023年7月11日
    0112
  • 编程初学者如何使用搜索引擎

    或许你会认为这篇文章的内容极为基础。事实上,我也是这么觉得的。但从很多同学的留言来看,还是有必要简单地科普一下,分享我的一点”搜索”经验。 如果你在学习编程…

    技术杂谈 2023年7月25日
    078
  • 什么是Redis

    Redis 是一个使用 C 语言写成的,开源的高性能key-value非关系缓存数据库。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集…

    技术杂谈 2023年7月23日
    072
  • 解决go-micro与其它gRPC框架之间的通信问题

    在之前的文章中分别介绍了使用gRPC官方插件和go-micro插件开发gRPC应用程序的方式,都能正常走通。不过当两者混合使用的时候,互相访问就成了问题。比如使用go-micro插…

    技术杂谈 2023年7月11日
    073
  • ENDIAN的由来及BIG-EDIAN 和LITTLE-ENDIAN(转)

    在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送…

    技术杂谈 2023年7月10日
    054
  • MCU软件最佳实践——独立按键

    短小精悍,适用于有rtos和无rtos场合的按键驱动程序 引子 在进行mcu驱动和应用开发时,经常会遇到独立按键驱动的开发,独立按键似乎是每一个嵌入式工程师的入门必修课。笔者翻阅了…

    技术杂谈 2023年7月11日
    093
  • 红黑树原理、查找效率、插入及变化规则分析

    引言 和2-3-4树的关系 红黑树 定义 红黑树的查找效率 红黑树的插入及变化规则 插入及变化规则 例子1 例子2 例子3 红黑树的插入及变化规则,对应在2-3-4树中是什么操作?…

    技术杂谈 2023年7月25日
    093
  • HTB靶场记录之Bastard

    1、靶机介绍 这次的靶机是Bastard。 2、信息收集 由于autorecon的速度比较慢,这里直接nmap -sC(默认脚本) -sS(快速扫描)过一下,80端口有个Drupa…

    技术杂谈 2023年5月31日
    083
  • 浅析重复线性渐变repeating-linear-gradient如何使用

    CSS3 线性渐变(linear-gradient)我们比较熟悉,但是有没有了解过重复线性渐变(repeating-linear-gradient)呢? repeating-lin…

    技术杂谈 2023年5月31日
    0115
  • OpenFeign

    OpenFeign—服务间的调用 一.什么是Feign和OpenFeign? 在使用Feign或者OpenFeign前,服务之间的调用路径在函数内部设置: 能不能像controll…

    技术杂谈 2023年7月25日
    059
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球