递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 5675|回复: 7
打印 上一主题 下一主题

[视窗] 完全基于火山的结构体封装方案

[复制链接]

69

主题

989

帖子

4466

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4466
跳转到指定楼层
楼主
发表于 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

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

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

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

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

下面是我写的一个示例,可以正常的和结构体、结构体数组、嵌套结构体进行交互
新建文件夹.zip (173.52 KB, 下载次数: 63) 好像这个版本只支持单重嵌入的结构体,等我有空了研究一下怎么支持多重嵌套



回复

使用道具 举报

69

主题

447

帖子

3111

积分

论坛元老

Rank: 8Rank: 8

积分
3111
沙发
发表于 2023-2-23 16:54:40 | 只看该作者
学习一下。
回复

使用道具 举报

0

主题

151

帖子

1694

积分

金牌会员

Rank: 6Rank: 6

积分
1694
板凳
发表于 2023-2-23 18:48:39 | 只看该作者
这可以有
回复

使用道具 举报

6

主题

64

帖子

2595

积分

金牌会员

Rank: 6Rank: 6

积分
2595
地板
发表于 2023-2-23 20:41:06 | 只看该作者
能用纯火山代码实现出这个功能很不错,但是你这个必须要使用者手动计算结构体各个成员的大小吧?如果只是用结构体和C++代码交互的话,我也花时间研究过,利用了现代C++(C++17)的特性,或许你可以参考一下。
Vol2CppStruct.zip (84.62 KB, 下载次数: 48)
火山PC交流群: 748413192
回复

使用道具 举报

12

主题

229

帖子

2059

积分

金牌会员

Rank: 6Rank: 6

积分
2059
5#
发表于 2023-2-23 20:47:45 来自手机 | 只看该作者
点个赞支持一下
回复

使用道具 举报

69

主题

989

帖子

4466

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4466
6#
 楼主| 发表于 2023-2-24 19:34:05 | 只看该作者
龙纹 发表于 2023-2-23 20:41
能用纯火山代码实现出这个功能很不错,但是你这个必须要使用者手动计算结构体各个成员的大小吧?如果只是用 ...

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

使用道具 举报

6

主题

64

帖子

2595

积分

金牌会员

Rank: 6Rank: 6

积分
2595
7#
发表于 2023-2-24 19:59:52 | 只看该作者
hcwanz 发表于 2023-2-24 19:34
主要是很多结构体就是给api当参数用的,我觉得每个需要用的结构体都单独封个类太麻烦了。我这个虽然需要 ...

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

使用道具 举报

37

主题

585

帖子

2857

积分

金牌会员

Rank: 6Rank: 6

积分
2857
8#
发表于 2023-3-2 21:16:12 | 只看该作者
学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-24 01:15 , Processed in 0.086676 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表