D中const和immutable有什么区别?

时间:2013-06-14 19:28:18

标签: const d immutability

D中的constimmutable类型限定符之间有什么区别?

4 个答案:

答案 0 :(得分:16)

const之类的东西不能通过该引用进行变异,但可以通过对同一数据的可变引用进行变异。 任何对该数据的引用都无法突变immutable的某些内容。所以,如果你有

const C c = foo();

然后你知道你不能通过c改变c引用的对象,但是c引用的对象的其他引用可能存在于你的代码中,如果它们是他们可以改变它,因此可以改变c看到的内容。但如果你有

immutable C c = foo();

然后你知道c引用的对象不可能改变。一旦构造了immutable对象,它就变异是违法的,除非你通过强制转换破坏类型系统,否则甚至不可能对immutable对象进行可变引用。而且,如果编译器选择将immutable对象放入只读内存中,如果你试图抛弃immutable并改变对象,你实际上可以获得段错误等。 const也是如此,因为const引用实际上可以引用immutable对象。抛弃constimmutable然后改变当时的可变对象是未定义的行为,基本上不应该这样做。

由于immutable对象永远不会被另一个引用变异,因此从多个线程中读取immutable对象是完全线程安全的。因此,immutable对象在线程之间隐式共享,而未明确标记为shared的所有其他对象都被视为线程本地。 immutable还为编译器提供了比const更好的优化机会,因为它保证永远不会改变,而const对象可以通过对同一数据的另一个引用来改变。

对于值类型,constimmutable之间没有太大区别(因为您不能对非可变值类型进行可变引用),但对于引用类型,有一个显着的差异。

答案 1 :(得分:14)

当您将某些内容声明为const时,您承诺不会对其进行修改。当某些东西被声明为immutable时,你会得到承诺,它不会在其他地方被修改(当然,你也不能修改它)

答案 2 :(得分:1)

它们与immutable数据不同,实际上可以放在内存的只读部分中,因此,任何修改的数据的尝试都将失败。

另一方面声明const(而不是不可变)的东西存在于r / w部分中,值仍然可以通过不同的非const引用来改变

所以,在这种情况下,“const-ness”可以被绕过,而不变性则不能。

Reference

答案 3 :(得分:0)

声明类型为const的变量可以接受可变值或不可变值。此定义与引用类型(如数组和对象或指针)相关。它通常用于函数参数。所以在D const中,是一种可变和不可变值的通配符属性。

对于使用char,int或float等赋值复制的值没有多大意义。

const和immutable的概念与C和C ++中的概念非常不同。我很困惑。