D中的const
和类型限定符有什么区别?immutable
4 回答
const
不能通过该引用改变但可以通过对相同数据的可变引用来改变的东西。任何对该数据的引用immutable
都无法改变的东西。所以,如果你有
const C c = foo();
那么你知道你不能改变c
throughc
引用的对象,但是你的代码中可能存在对 by 引用的对象的其他引用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
(因为您不能对非可变值类型进行可变引用),但对于引用类型,存在显着差异。
当您将某些内容声明为const
时,您承诺不会修改它。当某些东西被声明为immutable
时,你会得到承诺它不会在其他地方被修改(当然,你也不能修改它)
它们在immutable
数据方面有所不同,实际上可以放置在内存的只读部分中,因此,任何修改数据的尝试都会失败。
const
另一方面,在 r/w 部分中存在声明(而不是不可变)的内容,并且仍然可以通过对它的不同非常量引用来更改该值。
因此,在这种情况下可以绕过“const-ness”,而不变性则不能。
(参考)
声明为类型的变量const
可以接受可变值或不可变值。此定义与引用类型(如数组和对象或指针)相关。它通常用于函数参数。所以在 D 中 const 是一种用于可变和不可变值的通配符属性。
对于使用 char、int 或 float 等赋值复制的值没有多大意义。
const 和 immutable 的概念与 C 和 C++ 中的概念非常不同。我对此感到非常困惑。