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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

type
  Node = ref NodeObj
  NodeObj = object
    le, ri: Node
    data: int var
  n: Node
new(n)
n.data = 9

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

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

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

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

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

请看如下示例代码:

{.experimental.}
proc depth(x: NodeObj): int = ...
var
  n: Node
new(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

nim的引用和指针的更多相关文章

  1. c++中的引用与指针的区别

    http://blog.csdn.net/lyd_253261362/article/details/4323691 c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存 ...

  2. C++中引用与指针的区别(详细介绍)

    C++中引用与指针的区别(详细介绍) C++中的引用与指针的区别   指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一 ...

  3. C++ 中引用与指针的区别

    1.引用只是变量的一个别名,并不占用内存空间,而指针是一个变量,里面保存着被指向的变量在内存中的地址: 2 引用只能在定义时被初始化一次,之后不可变,而指针可变: 3 引用没有 const,指针有 c ...

  4. [ZZ]C++中,引用和指针的区别

    (1) 引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针. 由于C++ 要求 reference 总是指向一个对象所以 re ...

  5. Java中到底有没有指针;同时注意引用和指针的区别

    Java中引用的作用类似于指针,但是有区别:()    (1) 指针必然指向一个内存地址,如果你定义的时候不指定,就会乱指(很可能造成安全隐患)但是引用定义出来后默认指向为空.     (2) 指针可 ...

  6. java定义类 对象,引用,指针

    java是根据面向对象编程,因此有类和对象的概念,类分为普通类与抽象类. 一.定义类 类由N个 构造器  成员变量  方法组成,可以不定义,也可以根据语法定义N个. [修饰符] class 类名{ 构 ...

  7. 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

      您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...

  8. C、C++中引用与指针的区别

    1:引用的和指针在概念上的区别 引用是变量的别名,例如 int m; int &n=m; 引用作为一个别名.它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用 ...

  9. 浅谈C/C++引用和指针的联系和区别

    为什么C/C++语言使用指针? 答案:①一方面,每一种编程语言都使用指针.不止C/C++使用指针. 每一种编程语言都使用指针.C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来 ...

随机推荐

  1. 我开发的SNMP编译器和浏览器

    我开发的SNMP编译器和浏览器 什么是SNMP SNMP(Simple Network Management Protocol,简单网络管理协议)的前身是简单网关监控协议(SGMP),用来对通信线路进 ...

  2. php的cookie和session相同主域名共享

    如何使用chrome查看cookie和session详见另一篇文章,点这里 首先说cookie, $cookieDomain = '.elf.com'; setcookie('elf', 'im el ...

  3. Object.assign()方法

    对象的扩展 1.ES6中,对象的属性和方法可简写:对象的属性值可不写,前提是属性名已经声明: var name = "zhangsan"; "; var obj = { ...

  4. 在vCenter5.5中为用户创建角色,管理虚拟机

    在vSphere的使用中,如有只有vCenter+ESXi节点的两级配置,为了达到多租户管理及权限分配,可以在vCenter5.5中为用户创建角色,管理虚拟机 1.以管理员身份登陆vCenter 2. ...

  5. Java中super的几种用法并与this的区别

    1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base"); ...

  6. 分享个win平台cocos2d-x创建项目的快捷方式

    由于长期使用vs开发,相信使用vs开发的同学们也和我一样,都习惯点击图标然后就新建项目了,不是很适应命令的方式 由于vs2012一般都是win7 win8 win8.1这类系统开发,而这些系统,都是自 ...

  7. SQL Server 大数据量分页建议方案

    简单的说就是这个 select top(20) * from( select *, rowid = row_number() over(order by xxx) from tb with(noloc ...

  8. Unity加载模块深度解析(纹理篇)

    在游戏和VR项目的研发过程中,加载模块所带来的效率开销和内存占用(即“加载效率”.“场景切换速度”等)经常是开发团队非常头疼的问题,它不仅包括资源的加载耗时,同时也包含场景物件的实例化和资源卸载等.在 ...

  9. C语言小练习四

    题目要求:输入N个数,输出该数列中第k个最大者. 程序源码: #include <stdio.h> #include <string.h> void printResult(i ...

  10. easymock+junit+spring学习·

    Easymock学习                                Author:luojie 1.       Easymock简介 EasyMock 是一套通过简单的方法对于指定的 ...