D中的const
和immutable
类型限定符之间有什么区别?
答案 0 :(得分:16)
const
之类的东西不能通过该引用进行变异,但可以通过对同一数据的可变引用进行变异。 任何对该数据的引用都无法突变immutable
的某些内容。所以,如果你有
const C c = foo();
然后你知道你不能通过c
改变c
引用的对象,但是c
引用的对象的其他引用可能存在于你的代码中,如果它们是他们可以改变它,因此可以改变c
看到的内容。但如果你有
immutable C c = foo();
然后你知道c
引用的对象不可能改变。一旦构造了immutable
对象,它就变异是违法的,除非你通过强制转换破坏类型系统,否则甚至不可能对immutable
对象进行可变引用。而且,如果编译器选择将immutable
对象放入只读内存中,如果你试图抛弃immutable
并改变对象,你实际上可以获得段错误等。 const
也是如此,因为const
引用实际上可以引用immutable
对象。抛弃const
或immutable
然后改变当时的可变对象是未定义的行为,基本上不应该这样做。
由于immutable
对象永远不会被另一个引用变异,因此从多个线程中读取immutable
对象是完全线程安全的。因此,immutable
对象在线程之间隐式共享,而未明确标记为shared
的所有其他对象都被视为线程本地。 immutable
还为编译器提供了比const
更好的优化机会,因为它保证永远不会改变,而const
对象可以通过对同一数据的另一个引用来改变。
对于值类型,const
和immutable
之间没有太大区别(因为您不能对非可变值类型进行可变引用),但对于引用类型,有一个显着的差异。
答案 1 :(得分:14)
当您将某些内容声明为const
时,您承诺不会对其进行修改。当某些东西被声明为immutable
时,你会得到承诺,它不会在其他地方被修改(当然,你也不能修改它)
答案 2 :(得分:1)
它们与immutable
数据不同,实际上可以放在内存的只读部分中,因此,任何修改的数据的尝试都将失败。
另一方面声明const
(而不是不可变)的东西存在于r / w部分中,值仍然可以通过不同的非const引用来改变。
所以,在这种情况下,“const-ness”可以被绕过,而不变性则不能。
答案 3 :(得分:0)
声明类型为const
的变量可以接受可变值或不可变值。此定义与引用类型(如数组和对象或指针)相关。它通常用于函数参数。所以在D const中,是一种可变和不可变值的通配符属性。
对于使用char,int或float等赋值复制的值没有多大意义。
const和immutable的概念与C和C ++中的概念非常不同。我很困惑。