hcwanz 发表于 2023-2-23 16:12:54

完全基于火山的结构体封装方案

本帖最后由 hcwanz 于 2023-11-3 23:07 编辑

(好像c++的类本身就会和结构体一样进行字节对齐,所以如果不是嵌套的话,直接用类就行)
结构体本质上是一串基础类型数据的集合,那么理论上我们可以通过指针和基本类型数据在内存里自己造出所有结构体来。

但其中存在一个问题,就是结构体在内存上并非连续存储,在某些时候,两个成员之间,会存在一些空位。

网上针对结构体内存的讲解,不算错,但大多非常复杂且弱智。我这里讲一下我的理解,不一定对,但目前没出错,姑且算是对的。

我们先将一串内存想象成几个内存块
000000000000000000000000000000000000000000000000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

数组因为每个成员的尺寸是一样的,所以一个块对应一个成员。而每个块的尺寸是成员的尺寸。

结构体每个成员的尺寸是不同的,所以采用的是一个块对应数个成员的原则。每个块的大小由最大的成员决定。

在计算内存位置的时候,首先将成员尺寸依次相加放入一个块中,直到溢出(也就是成员的和大于块了),这时将导致溢出的成员拿出来,放入下一个块中。

然后就完了,一个结构体就造好了。
嵌套的有点不同,它的块大小,是由基础成员决定,但在创建的时候,会将子结构体算作一个成员

下面是我写的一个示例,可以正常的和结构体、结构体数组、嵌套结构体进行交互
好像这个版本只支持单重嵌入的结构体,等我有空了研究一下怎么支持多重嵌套



itismine 发表于 2023-2-23 16:54:40

学习一下。

lhy201233 发表于 2023-2-23 18:48:39

这可以有

龙纹 发表于 2023-2-23 20:41:06

能用纯火山代码实现出这个功能很不错,但是你这个必须要使用者手动计算结构体各个成员的大小吧?如果只是用结构体和C++代码交互的话,我也花时间研究过,利用了现代C++(C++17)的特性,或许你可以参考一下。

秋天的童话 发表于 2023-2-23 20:47:45

点个赞支持一下

hcwanz 发表于 2023-2-24 19:34:05

龙纹 发表于 2023-2-23 20:41
能用纯火山代码实现出这个功能很不错,但是你这个必须要使用者手动计算结构体各个成员的大小吧?如果只是用 ...

主要是很多结构体就是给api当参数用的,我觉得每个需要用的结构体都单独封个类太麻烦了。我这个虽然需要计算成员大小,但不用单独封类,直接在方法里就能定义

龙纹 发表于 2023-2-24 19:59:52

hcwanz 发表于 2023-2-24 19:34
主要是很多结构体就是给api当参数用的,我觉得每个需要用的结构体都单独封个类太麻烦了。我这个虽然需要 ...

确实,各有各的麻烦。这是我一年多前封装的了,我当时想的是既然麻烦都麻烦了,那就只麻烦一次,封装一次这个类,后续就直接复用了,操作火山结构体也比较友好,有火山的代码补全。

山梦 发表于 2023-3-2 21:16:12

学习学习
页: [1]
查看完整版本: 完全基于火山的结构体封装方案