3

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

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

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

4

4 回答 4

3

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

于 2015-08-16T05:31:56.157 回答
2

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

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

于 2015-08-16T06:00:31.177 回答
2

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

于 2015-08-16T05:18:11.600 回答
1

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

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

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

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

于 2015-08-16T06:04:03.090 回答