【发布时间】:2013-06-11 12:58:18
【问题描述】:
D 中的const 和immutable 类型限定符有什么区别?
【问题讨论】:
-
您可以在此链接ddili.org/ders/d.en/const_and_immutable.html 上阅读有关不可变性的信息
标签: constants d immutability
D 中的const 和immutable 类型限定符有什么区别?
【问题讨论】:
标签: constants d immutability
const 不能通过该引用进行变异,但可以通过对相同数据的可变引用进行变异。 immutable 不能通过 any 对该数据的引用来改变。所以,如果你有
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 之间并没有太大区别(因为您不能对非可变值类型进行可变引用),但对于引用类型,则存在显着差异。
【讨论】:
immutable,因为很明显它不能在不知道它是值类型的情况下进行变异,但这只是个人喜好。
string 的字符中丢弃immutable 是完全可以的吗?
string 中访问单个char,则无需丢弃不可变,因为它是一种值类型,将其分配给任何东西都会复制它。危险的是抛弃const 或immutable 以获得引用类型(如类对象或数组或字符串)。而且我不相信你可以改变字符串中的任何元素而不将整个字符串转换为char[],因为在尝试分配给它时转换单个元素会导致右值,而不是左值,所以分配不会'不管可变性如何都不起作用。
当您声明某个内容为const 时,您保证不会修改它。当某个东西被声明为immutable 时,你会得到保证它不会在其他地方被修改(当然,你也不能修改它)
【讨论】:
它们的不同之处在于 immutable 数据实际上可以放置在内存的只读部分中,因此,任何修改数据的尝试将失败.
另一方面,声明为const(并且不是不可变的)的东西存在于 r/w 部分中,并且值仍然可以通过对它的不同非常量引用来更改。 p>
因此,在这种情况下可以绕过“const-ness”,而不变性则不能。
【讨论】:
const 数据实际上可以是 immutable。所以const 数据也可能在只读部分,因为immutable 数据隐式转换为const。
声明为const 类型的变量可以接受可变值或不可变值。此定义与引用类型(如数组和对象或指针)相关。它通常用于函数参数。所以在 D 中 const 是一种用于可变和不可变值的通配符属性。
对于使用 char、int 或 float 等赋值复制的值没有多大意义。
const 和 immutable 的概念与 C 和 C++ 中的概念非常不同。我对此感到非常困惑。
【讨论】: