开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6714|回复: 4
收起左侧

[技术专题] 易语言 动态分配数据结构

[复制链接]
结帖率:100% (3/3)
发表于 2020-8-23 06:38:25 | 显示全部楼层 |阅读模式   广东省汕头市
数据结构,易语言称为:自定义数据类型。
但它不够灵活,我们会在某些特殊情况时,希望它可以动态分配很多个,而且不要在子程序结束时就自动释放内存。
C++有new和delete操作符,而易语言没有。
但是我们可以用常量来做内存偏移。
数据结构不过是一块内存而已,通过 结构.成员 这种方式访问成员,结构它有内存地址,成员它就是内存偏移。
所以 结构.成员 相当于 结构内存地址+成员内存偏移。
例如:
  
数据类型名公开备 注
结构 
成员名类 型传址数组备 注
A整数型  
B整数型  


       
我们改成这样:
  
常量名称常量值公 开备 注
结构_大小8 
结构_A0 
结构_B4 



用下划线来代表原来的“.”号。内存偏移从0开始,整数型占4个字节,结构_大小 整个结构的大小,分配内存时用到。
但考虑到名称冲突问题,直接记住不跟下划线就是大小了:
  
常量名称常量值公 开备 注
结构8 
结构_A0 
结构_B4 



用法:
结构 = 申请内存(#结构)
整数到指针(结构+#结构_A, 1) '相当于:结构.A = 1
输出调试文本(指针到整数(结构+#结构_A)) '相当于:输出调试文本(结构.A)

当不再用时记得:释放内存(结构)



对了,虽然可以直接把整个数据结构复制到新的内存,但这样做不够效率。而且易语言的数据结构是强制4字节对齐的。
在调用API的时候会进行转换并分配内存,调用结束后会释放。
当调用API复制内存的时候其实是复制两遍了。
如果你不先算好大小的话调用LocalSize又被来一次。
RtlMoveMemory(地址,结构,LocalSize(结构))
当然也可以反过来:RtlMoveMemory(结构,地址,LocalSize(结构))
这里是演示,建议用常量的方法。




结帖率:83% (5/6)

签到天数: 8 天

发表于 2024-6-10 14:11:35 | 显示全部楼层   陕西省西安市
楼主的很多帖子都让我受益匪浅,在此真心感谢!
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 20 天

发表于 2024-1-27 09:32:36 | 显示全部楼层   山东省淄博市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 21 天

发表于 2022-3-31 05:28:01 | 显示全部楼层   山东省烟台市
常量定义+内存偏移太牛逼了
回复 支持 反对

使用道具 举报

结帖率:98% (96/98)

签到天数: 11 天

发表于 2020-8-23 11:49:05 | 显示全部楼层   湖北省咸宁市
强啊  不过确实 其他语言有new就是个优势
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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