持久性内存编程——类型

2024-02-29 21:48
文章标签 类型 内存 编程 持久性

本文主要是介绍持久性内存编程——类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在之前的所有关于持久化内存编程的文章中,代码片段和示例都有持久指针(pmemoid),没有任何类型信息——它们是简单的C结构。在pmem库开发的早期,开发者发现使用类似的东西非常容易出错,而且通常很困难。他们在用类型安全容器封装pmemoids时付出了相当大的努力,最终结果可以与C++11中的SydDypTr等进行比较,之后的所有内容将只使用类型安全特性。

目录

布局声明

类型化持久指针

PMEMoid和TOID操作

运行时类型安全

用例


布局声明

所有使用pmemobj的持久内存程序都应该有一个明确定义的内存布局,最好是在自己的文件中进行布局的定义。为了提供运行时和编译时类型的安全性,除了声明结构之外,还需要使用特殊的宏。例如,我们的字符串存储示例的布局如下所示:

POBJ_LAYOUT_BEGIN(string_store);
POBJ_LAYOUT_ROOT(string_store, struct my_root);
POBJ_LAYOUT_END(string_store);#define	MAX_BUF_LEN 10
struct my_root {char buf[MAX_BUF_LEN];
};

现在可以在代码中使用类型化的持久指针。此代码中的字符串存储只是一个名称,创建或打开具有特定布局的池时,建议使用pobj_layout_name宏,如下所示:

pmemobj_create(path, POBJ_LAYOUT_NAME(string_store), PMEMOBJ_MIN_POOL, 0666);
...
pmemobj_open(path, POBJ_LAYOUT_NAME(string_store));

如果你觉得所有这些都令人困惑,请先阅读这篇文章( this ),这对该内容有深入解释。

类型化持久指针

使用以下构造来代替pmemoids指针:

TOID(struct my_root) root;

要取消引用,不再需要将另一个变量与pmemobj_direct结合使用,首选的方法是使用d_rw进行写入,使用d_ro进行读取。如下所示:

if (D_RO(root)->buf[0] != 0)D_RW(root)->buf[0] = 0;

大多数IDE都会正确地评估这些宏,并自动完成类型代码。

PMEMoid和TOID操作

一般来说,有两种类型的安全宏可以区分:在原始pmemoid上操作的宏(前缀为OID_),在类型TOID上操作的宏(前缀为TOID_)。

所有pmemobj_函数只接受原始pmemoids作为参数。我们通常建议只使用宏,但如果需要将TOID“强制转换”为pmemoid,可以这样做:

TOID(struct foo) data;
pmemobj_direct(data.oid);

所有没有TOID_或OID_前缀的宏通常都采用类型化指针,并将其作为结果返回(如POBJ_ROOT宏)。

运行时类型安全

布局中的每种类型都在内部分配了一个唯一的编号,然后可以用于验证。

例如,对现有软件的更新可能改变了布局,如下所示:

struct my_root_v1 {TOID(struct foo) data;
}
struct my_root_v2 {TOID(struct bar) data;
}

要检查布局的版本是否与现有对象对应,可以使用以下表达式:

if (TOID_VALID(D_RO(root)->data)) {/* can use the data ptr safely */
} else {/* declared type doesn't match the object */
}

如果不确定对象类型,也可以依赖嵌入的类型号,如:

PMEMoid data;
TOID(struct foo) foo;
TOID(struct bar) bar;
if (OID_INSTANCEOF(data, struct foo)) {TOID_ASSIGN(foo, data);
} else if (OID_INSTANCEOF(data, struct bar)) {TOID_ASSIGN(bar, data);
} else {/* error */
}

与高级语言的相似性并非偶然。

用例

这是最后一次修改字符串存储示例。layout.h修改可以在上面看到。首先,从root对象开始。可以使用以下行,而不是首先使用pmemobj_root函数,然后使用pmemobj_direct作为实际指针:

TOID(struct my_root) root = POBJ_ROOT(pop, struct my_root);

还记得怎么保证代码会变短的吗?writer.c:

TX_BEGIN(pop) {TX_MEMCPY(D_RW(root)->buf, buf, strlen(buf));
} TX_END

因为不再有rootp了,这个也变得简单了,reader.c

printf("%s\n", D_RO(root)->buf);

完整代码:repository

原文来自:http://pmem.io/2015/06/16/types.html

这篇关于持久性内存编程——类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/760200

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎