【问题标题】:Mutable variable memory location可变变量内存位置
【发布时间】:2015-11-09 00:10:32
【问题描述】:

我对 C++ 中的可变变量有以下理解。

  1. 它是一个特殊的存储类。
  2. 可变变量可以被常量对象修改。
  3. 您想要使用可变变量的示例是您不想执行昂贵的操作来获得结果,除非特别要求。如果特别要求,您的程序将执行一次操作并将结果缓存在可变变量中。

我的问题是关于记忆的。编译器将可变变量存储在内存中的什么位置?既然它是可修改的,那么它肯定不会是“只读”内存。

【问题讨论】:

  • 感谢所有宝贵的 cmets!

标签: c++ mutable storage-class-specifier


【解决方案1】:

类的所有成员的大小(由sizeof 确定)至少为1mutable 成员也是如此,这意味着所有类成员都必须占用内存中的某些位置范围。

mutable 成员的唯一特别之处在于它的值可以更改,即使它位于const 对象中。如何实现这一点取决于编译器。通常,编译器在编译时强制执行 constness。换句话说,如果一个对象是const,它的成员在逻辑上也是const,并且尝试修改(或调用非const操作)任何成员,那么代码将无法编译除非该成员是 mutable

实际上没有必要在运行时将const 对象或其成员弹出到只读内存中。如果确实这样做了,那么即使阻止对其他成员的更改,也需要进行一些特殊处理以允许更改其mutable 成员。例如,所有对象的成员都可能被放置在可修改的内存中,并且只有非可变的成员被标记(例如,具有操作系统支持),因此它们不能在运行时更改。

使用可变成员的一个常见原因是存储可重复的昂贵操作的结果(为相同的输入提供相同的结果)。如果不需要结果,也不需要昂贵的操作。如果需要重复访问结果,则可变成员允许第一次存储结果,而不是重复执行昂贵的操作。

【讨论】:

    【解决方案2】:

    这完全取决于编译器,它可以执行逃逸分析并确定对象永远不能被修改,在这种情况下,它可以写入二进制文件的read-only 部分。 mutable 存储类说明符仅放宽了编译时间要求。

    对象需要按声明顺序分配,因此无论存储类说明符如何,所有变量都位于同一内存区域中。但是,如果机器支持 read-only 位,则不会在 const 字节区域上设置它。

    【讨论】:

      【解决方案3】:

      mutable (mutable) 只是编译器的类型限定符,如constvolatile。 类的成员存储在连续的内存块上(静态的除外)。如果将成员定义为const,并不意味着编译器会将其放入RO 内存中。 const 声明在运行时不会产生任何影响,它只是编译器在编译期间执行适当检查和优化的关键字。 一旦您将一个类(或方法)定义为const,但您仍然需要修改该类的特定成员(如互斥锁或您提到的 - 缓存一个值),您让编译器知道这个特定成员是 @ 987654328@,否则会出现编译错误。

      【讨论】:

        【解决方案4】:

        大概这是特定于编译器的,但我想大多数编译器会简单地选择总是将具有可变成员的类(整个类)定位到非常量内存中以允许这样做。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-20
          • 1970-01-01
          • 2018-04-02
          • 1970-01-01
          相关资源
          最近更新 更多