精易论坛

标题: 易语言 动态分配数据结构 [打印本页]

作者: LLJ    时间: 2020-8-23 06:38
标题: 易语言 动态分配数据结构
数据结构,易语言称为:自定义数据类型。
但它不够灵活,我们会在某些特殊情况时,希望它可以动态分配很多个,而且不要在子程序结束时就自动释放内存。
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(结构))
这里是演示,建议用常量的方法。




作者: showtime    时间: 2020-8-23 11:49
强啊  不过确实 其他语言有new就是个优势
作者: 阿龙    时间: 2022-3-31 05:28
常量定义+内存偏移太牛逼了
作者: year1970    时间: 2024-1-27 09:32
感谢分享
作者: Timelord    时间: 2024-6-10 14:11
楼主的很多帖子都让我受益匪浅,在此真心感谢!




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4