nim的引用和指针

简介: nim语言的引用和其他语言的指针有点相似 可以提供一种“多对一”的关系 这就意味着不同的引用可以指向同一个内存位置   nim区分可被追踪的引用和不可被追踪的引用 不可被追踪的引用又称为指针 可被追踪的引用可以被垃圾回收器回收 不可被追踪的引用指向手动分配的对象,或其他地方创建出来...

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

 

 

 

 

目录
相关文章
|
1月前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
41 9
|
2月前
|
存储 安全 C语言
引用指针
引用指针
16 1
|
2月前
|
存储 安全 C++
在C++指针和引用
在C++指针和引用
|
2月前
|
存储 算法 C语言
通过指针引用数组元素
通过指针引用数组元素
21 0
|
2月前
|
存储 算法 C语言
通过指针引用多维数组
通过指针引用多维数组
11 0
|
2月前
|
存储 安全 C++
CPP的指针和引用
CPP的指针和引用
16 0
C4.
|
2月前
|
存储 程序员 C语言
C语言中如何通过指针引用字符串
C语言中如何通过指针引用字符串
C4.
20 0
C4.
|
2月前
|
算法 安全 程序员
C语言中如何通过指针引用数组
C语言中如何通过指针引用数组
C4.
26 0
|
2月前
|
存储 程序员 C++
C++的指针和引用
C++的指针和引用
|
6天前
|
存储 安全 C++
深入理解C++中的指针与引用
深入理解C++中的指针与引用
9 0