C++23-自建 Any 类型工程展示

内容目录

工程下载地址: 点此下载

Any 类样本展示

简介

这是一个围绕 Any 类实现的库,我删除了大部分与 Any 无关的代码,只保留了 Any 的基本功能与其相关的代码。
Any 是一个强大的类型,它可以存储任何类型的数据,并且可以安全地从 Any 类型中检索原始类型,而我这里利用了 C++23 重新实现了此类型。

构建说明

  • 我这里使用的是 CMake 构建,具体的构建脚本已经下发到每个模块了,同时创建了一个批处理文件 windows_build_all_x64.bat 来构建,如果你的编译器不是 Visual Studio 17 2022 的话,你需要在批处理文件中进行修改。
  • 运行批处理文件之后,你可以在生成的 Build 文件夹中找到对应的 sln 文件并使用你自己的 IDE 打开。
  • 运行时请选择 Launch 模块,main 函数中已经写好了测试代码,你可以直接运行查看结果。
  • C++ 23 标准,由于我已经写好了 CMake 脚本,所以无须特意修改其他内容。

特性

  • 类型安全:保证在转换和存储过程中的类型安全。
  • 灵活性:可以存储几乎任何类型,包括基本数据类型、自定义类型等。
  • 易用性:简单的接口,方便快速学习与使用。
  • 先进性: 利用了 C++20 提供的约束,可以有效防止 SAFINE 时带来的不雅观。
  • 内存压缩: 利用了 4 字节对齐时,地址低两位为 0 的特性,成功把类型注入进去了,读取和写入利用位操作,成功节省 2 位内存。不过可惜的是啊,这个特性只适用于 4 字节或者他倍数的情况,如果是嵌入式系统就不好整了=-=。

主要功能

  • 实现了 Any 的基本功能,可以存储几乎任何类型,并且可以安全地从 Any 类型中检索原始类型。
  • 实现了分别储存平凡类型,小类型和大类型,这三种类型除了大类型的外部空间,其他的全部在联合体内,这样可以节省内存。
  • 实现了主要接口,赋值构造函数,移动构造函数,复制赋值运算符,移动赋值运算符等常用接口,同时配合完美引用与完美转发,可以接受任何类型。
  • 实现了 Any 的类型转换,可以安全地从 Any 类型中检索原始类型或直接赋值到变量上。

我觉得比较厉害的地方

  • 首先这里内部定义了一个 RTTI,此类型保存了输入类型的所有信息,包括数据大小,对齐,以及对应类型的每一个函数指针(赋值函数,构造函数),这样可以方便的无损转换类型。
  • 分配平凡类型,小类型,大类型三种不同的类型,这三个会被储存在同一块内存区域,并根据类型的不同做不同的处理。
  • C++ 自带的 rtti 中,提供了 typeid 返回一个 type_info,而对齐为 4 的时候,地址低位的两位会保证为 00,利用这两位二进制,我们可以在其中储存 4 种不同类型,而得到此 type_info 的时候,我们可以直接使用位操作将地址恢复成原样,从而取得对应的类型。
  • 用了约束,代码会好看一点
  • 由于限制了 Any 类型为 64 字节,缓存行 64 字节是现代计算机系统的常见配置,所以说这个结构体和缓存行完全对齐时,可以避免缓存行分裂,还能保证被加载到缓存的数据可以提高访问速度。
  • 另外 平凡情况 与 Small情况 都是存储在类大小本身的,所以他在某些情况下可以直接存储下具有 SSO 或者 SAO 的类型,而不用额外申请内存。
滚动至顶部