【问题标题】:What is the difference between const and immutable in D?D中的const和immutable有什么区别?
【发布时间】:2013-06-11 12:58:18
【问题描述】:

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

【问题讨论】:

标签: constants d immutability


【解决方案1】:

const 不能通过该引用进行变异,但可以通过对相同数据的可变引用进行变异。 immutable 不能通过 any 对该数据的引用来改变。所以,如果你有

const C c = foo();

那么你知道你不能改变cc引用的对象,但是你的代码中可能存在对c引用的对象的其他引用,如果它们是可变的,它们可以对其进行变异,从而改变c 看到的内容。但是如果你有

immutable C c = foo();

那么您知道c 引用的对象不可能更改。一旦构造了immutable 对象,对其进行变异是非法的,除非您通过强制转换颠覆类型系统,否则甚至不可能对immutable 对象进行可变引用。而且由于如果编译器选择将immutable 对象放入只读内存中,那么如果您曾经尝试丢弃immutable 并改变对象,您实际上可能会遇到段错误等。 const 也是如此,因为 const 引用实际上可以引用 immutable 对象。抛弃 constimmutable 然后改变当时可变的对象是未定义的行为,基本上不应该这样做。

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

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

【讨论】:

  • 感谢您提供非常有启发性的答案。 D 开发人员通常将哪一种用于值类型?
  • @user763305 目前,我想不出任何技术上的理由来偏爱其中一个,而且我不知道一般的 D 开发人员选择使用什么。就个人而言,我选择immutable,因为很明显它不能在不知道它是值类型的情况下进行变异,但这只是个人喜好。
  • 但是从string 的字符中丢弃immutable 是完全可以的吗?
  • @DmitriNesteruk 如果您在string 中访问单个char,则无需丢弃不可变,因为它是一种值类型,将其分配给任何东西都会复制它。危险的是抛弃constimmutable 以获得引用类型(如类对象或数组或字符串)。而且我不相信你可以改变字符串中的任何元素而不将整个字符串转换为char[],因为在尝试分配给它时转换单个元素会导致右值,而不是左值,所以分配不会'不管可变性如何都不起作用。
【解决方案2】:

当您声明某个内容为const 时,您保证不会修改它。当某个东西被声明为immutable 时,你会得到保证它不会在其他地方被修改(当然,你也不能修改它)

【讨论】:

    【解决方案3】:

    它们的不同之处在于 immutable 数据实际上可以放置在内存的只读部分中,因此,任何修改数据的尝试失败.

    另一方面,声明为const(并且不是不可变的)的东西存在于 r/w 部分中,并且值仍然可以通过对它的不同非常量引用来更改。 p>

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

    (Reference)

    【讨论】:

    • 这并不完全正确,因为 const 数据实际上可以是 immutable。所以const 数据也可能在只读部分,因为immutable 数据隐式转换为const
    • @yaz 同意。在这种情况下,我不是在谈论不可变被强制转换为 const。
    【解决方案4】:

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

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

    const 和 immutable 的概念与 C 和 C++ 中的概念非常不同。我对此感到非常困惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 2013-07-12
      • 2010-10-27
      • 1970-01-01
      相关资源
      最近更新 更多