我什么时候应该在Chapel中使用Record vs a Class

时间:2018-01-18 21:58:41

标签: chapel

在Chapel中使用Record类型与Class的时候有什么用?在IRC上,有人提到记录更好地分配在区域设置上。

1 个答案:

答案 0 :(得分:4)

Chapel中的记录和类类似,它们都支持使用字段和方法创建对象。也就是说,也存在一些重大差异。在这里快速回顾一下这些差异( tl; dr:记录大致类似于C ++结构,而类大致类似于Java类),然后是一个摘要,给出了一些关于何时的指示可能会选择使用其中一种:

变量的性质

  • 记录变量直接表示记录对象
  • 类变量表示类对象的引用(指针)

换句话说,记录变量记录对象,因此两者之间没有区别。相反,类变量指向一个类对象,该类对象可以存储在与对象本身不同的区域设置中(即,类变量可以指存储在分布式存储器中的对象)。

这意味着当一条记录被分配给另一条记录时,RHS记录的值被复制到LHS记录的值(例如,通常RHS记录的字段被复制到LHS记录)。另一个含义是记录必须定义(或使用编译器提供的)复制初始化器,并且通常提供0参数初始化器来建立新的记录对象。

相反,当一个类被分配给另一个类时,它使LHS类变量引用(指向)与RHS类变量相同的对象。

分配/解除分配

  • 类对象在堆上分配,可以由各种内存管理策略控制
  • 记录对象已分配"到位" (例如,在当前堆栈帧上)并自动解除分配(例如,当它们超出范围时)

这意味着类对象的生命周期独立于程序的结构,并依赖于其中一个策略来管理其内存(ownedshared,{{1} },borrowed)。相比之下,记录对象可以被认为是自动内存管理,但受到词法范围的限制。

这也意味着如果你有一个类数组,你通常会创建一个连续的指针序列,它可以引用生活在系统任何地方的对象(本地堆或其他一些语言环境的堆) )。如果您有一个记录数组,它的存储通常是一个连续的记录对象序列。

这意味着如果你想创建一个基于指针的"" Chapel中的数据结构 - 如链接列表,树或图形 - 您通常会使用类对象来存储该数据结构的节点,并使用类类型的字段来引用它们的邻居(而使用它们表示这些节点将具有挑战性记录,因为Chapel没有指针,他们就地分配了。

继承/方法调度

  • 一个类可以声明为另一个类的子类,支持虚方法/动态调度
  • 记录不支持对象层次结构,也不支持虚拟/动态调度

这意味着如果要像Java或C ++一样创建复杂的对象层次结构,那么您将要使用类,并且这些类层次结构的初始化器本身是分层的。

摘要

鉴于这些区别,您通常希望在以下情况下使用类:

  • 你想创建一个基于指针的""数据结构(例如,链表)因为类对象可以通过使用类变量字段来引用它们自己/
  • 您希望使用不受其词法范围约束的对象
  • 您希望使用身份重要的对象
  • 您想要创建支持动态方法调度的对象层次结构

您通常希望在以下情况下使用记录:

  • 价值比身份更重要,可以复制
  • 的价值
  • 您希望更好地控制对象在内存中的布局方式
  • 您希望对象内存由变量的范围管理

在实践中,将两者结合起来可能非常强大。例如,具有类字段的记录可用于通过使类实现对象的标识来创建引用计数对象,并且记录通过赋值重载和复制初始化器来处理引用计数语义当记录的副本进入和离开范围,被分配等时