博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nim的引用和指针
阅读量:7118 次
发布时间:2019-06-28

本文共 1496 字,大约阅读时间需要 4 分钟。

nim语言的引用和其他语言的指针有点相似

可以提供一种“多对一”的关系

这就意味着不同的引用可以指向同一个内存位置

 

nim区分可被追踪的引用和不可被追踪的引用

不可被追踪的引用又称为指针

可被追踪的引用可以被垃圾回收器回收

不可被追踪的引用指向手动分配的对象,或其他地方创建出来的一块内存区域

这也就是说,不可被追踪的引用是不安全的

对于某些底层操作,不可被追踪的引用有其存在的必要

 

可被追踪的引用使用ref关键字定义,

不可被追踪的引用使用ptr关键字定义

 

空下标的方括号[]可以用来解引用

addr方法可以返回一个实例的地址

对于一个地址来说,它始终是一个不可追踪的引用

所以addr方法也是一个不安全的方法。

 

.操作符和[]操作符可以隐式执行,先来看一下下面的代码

type  Node = ref NodeObj  NodeObj = object    le, ri: Node    data: intvar  n: Nodenew(n)n.data = 9

在上面的代码中,不需要写成n[].data,

因为方括号操作符已经隐式执行了

事实上nim官方也强烈不建议写成n[].data

 

另外,自动解引用操作也直接作用于一个方法的调用

但目前看来,还必须加上{.experimental.}配置节

请看如下示例代码:

{.experimental.}proc depth(x: NodeObj): int = ...var  n: Nodenew(n)echo n.depth

也不用写成n[].depth

 

为了简化类型检查,nim语言不支持递归元组

下面的写法是错误的

type MyTuple = tuple[a: ref MyTuple]

同样 T = ref T 也是错误的

 

如果一个对象只能出现其引用类型,不能出现其值类型

那么可以用如下方法完成:

type  Node = ref object    le, ri: Node    data: int

 

可以使用内置的new方法为一个可被追踪的对象分配内存

可以使用alloc、dealloc和realloc来应对不可被追踪的对象

这些方法的具体信息都可以在system类库的说明文档中找到

 

如果一个引用指向为空,那么这个引用的值就是nil

 

如果你碰到一个不可被追踪的对象里面包含一个可被追踪的对象(或者是一个字符串、又或者是一个sequences)

那么就需要特别留意了,为了让一切都正常释放,

你必须在释放不可被追踪的对象之前,使用内置的GCunref方法处理一下这个对象的那些特殊属性

请看下面的示例代码:

type  Data = tuple[x, y: int, s: string]# 在内存堆上创建一个不可被追踪的对象:var d = cast[ptr Data](alloc0(sizeof(Data)))# create a new string on the garbage collected heap:d.s = "abc"# 告诉 GC 这个string类型的属性已经没有存在的必要了:GCunref(d.s)# 释放不可被追踪的对象:dealloc(d)

如果不用GCunref方法处理一下对象的字符串属性,

那么这个字符串所占用的内存将永远不会被释放

上面的代码同时也展示了:

怎么获得一个类型的size

alloc0方法创建一个没有类型的指针

cast方法可以绕过类型系统,让指针具有类型ptr Data

只有在非常必要的时候再用cast方法,因为他会破坏类型安全,导致不可预知的BUG

 

 

 

 

转载地址:http://slbel.baihongyu.com/

你可能感兴趣的文章
Windows7(32bit)用Firefly创建第一个示例
查看>>
《软件性能测试与LoadRunner实战教程》新书上市
查看>>
Windows批处理中的等待技巧
查看>>
艾伟_转载:使用AOP动态调用WebService
查看>>
C#收发邮件(Jmail+Professional+v4.4+特别版)
查看>>
嵌入式计算机与PC机的区别
查看>>
FastReport微调
查看>>
nginx下的文件下载防盗链(HttpAccessKeyModule)
查看>>
Linq延迟执行(转)
查看>>
Django实战(3):Django也可以有scaffold
查看>>
简单缓存 datatable
查看>>
MFC界面的完善
查看>>
WPF&SL之Basic MVVM
查看>>
On :target
查看>>
最新30幅动人心脾的优秀摄影作品欣赏
查看>>
Map 3D 2013 新功能和新API WebCast视频下载
查看>>
2012年7月感想
查看>>
Memcached的分布式算法-Consistent Hashing
查看>>
Spring-MVC入门(一):入门实例
查看>>
MongoDB 分片
查看>>