D 语言的变量生命周期

来源:互联网 发布:openstack源码 编辑:程序博客网 时间:2024/06/04 19:57

对于编写应用的 C++ 程序员,生命周期 (Lifecycle) 恐怕是所有需要注意的事项里面最讨厌,最容易导致错误,而且出错后后果最严重的一个了。

D 作为 C++ 的改进者,在生命周期上有了不少改进,不幸的是其中一些改进可能是违反 C++ 程序员直觉的,下面列出一些常见差异。

  1. struct 和 class

在 C++ 里,struct 跟 class 没有本质区别。而 D 的 struct 却不然,它更像是 C# 的 struct 而不是 C++ 的。在 D 中,struct 是值类型 (value type),而 class 是引用类型 (reference type)。这种区别决定了他们在内存中的分配方式不同。

 

上面的代码,在 C++ 和 D 中的意思是一样的,a1 是一个分配在栈上的对象,而 pa 指向一个分配在堆上的对象。但如果是 class:

 

 

且不说 C++ 不会接受 a3,它们的意思也和 C++ 程序员可能想到的大不相同:

  • a1 是一个引用,它还没有指向任何对象(这和 Java, C# 一致)
  • a2 是一个引用,指向一个分配在堆上的对象(这和 Java, C# 也一致)
  • a3 是一个引用,它指向一个分配在栈上的对象(这相当于 C++ 中写 A a3)

scope 是 D 语言提供 RAII 语义的方式,尽管这里有 new 字,但 scope 决定了 a3 所指向的对象是分配在栈上的,因此当函数返回时,会被立即销毁。

再强调一下,scope 变量是分配在栈上的,这不仅意味着它有可确定的生命周期,而且意味着创建它不需要昂贵的动态内存分配,所以就像在 C++ 中我们应该尽可能多的采用栈对象,在 D 中我们应该尽可能多的采用 scope 对象

原创粉丝点击