【问题标题】:Mutable variable memory location可变变量内存位置
【发布时间】:2015-11-09 00:10:32
【问题描述】:
我对 C++ 中的可变变量有以下理解。
- 它是一个特殊的存储类。
- 可变变量可以被常量对象修改。
- 您想要使用可变变量的示例是您不想执行昂贵的操作来获得结果,除非特别要求。如果特别要求,您的程序将执行一次操作并将结果缓存在可变变量中。
我的问题是关于记忆的。编译器将可变变量存储在内存中的什么位置?既然它是可修改的,那么它肯定不会是“只读”内存。
【问题讨论】:
标签:
c++
mutable
storage-class-specifier
【解决方案1】:
类的所有成员的大小(由sizeof 确定)至少为1。 mutable 成员也是如此,这意味着所有类成员都必须占用内存中的某些位置范围。
mutable 成员的唯一特别之处在于它的值可以更改,即使它位于const 对象中。如何实现这一点取决于编译器。通常,编译器在编译时强制执行 constness。换句话说,如果一个对象是const,它的成员在逻辑上也是const,并且尝试修改(或调用非const操作)任何成员,那么代码将无法编译除非该成员是 mutable。
实际上没有必要在运行时将const 对象或其成员弹出到只读内存中。如果确实这样做了,那么即使阻止对其他成员的更改,也需要进行一些特殊处理以允许更改其mutable 成员。例如,所有对象的成员都可能被放置在可修改的内存中,并且只有非可变的成员被标记(例如,具有操作系统支持),因此它们不能在运行时更改。
使用可变成员的一个常见原因是存储可重复的昂贵操作的结果(为相同的输入提供相同的结果)。如果不需要结果,也不需要昂贵的操作。如果需要重复访问结果,则可变成员允许第一次存储结果,而不是重复执行昂贵的操作。
【解决方案2】:
这完全取决于编译器,它可以执行逃逸分析并确定对象永远不能被修改,在这种情况下,它可以写入二进制文件的read-only 部分。 mutable 存储类说明符仅放宽了编译时间要求。
对象需要按声明顺序分配,因此无论存储类说明符如何,所有变量都位于同一内存区域中。但是,如果机器支持 read-only 位,则不会在 const 字节区域上设置它。
【解决方案3】:
mutable (mutable) 只是编译器的类型限定符,如const 或volatile。
类的成员存储在连续的内存块上(静态的除外)。如果将成员定义为const,并不意味着编译器会将其放入RO 内存中。 const 声明在运行时不会产生任何影响,它只是编译器在编译期间执行适当检查和优化的关键字。
一旦您将一个类(或方法)定义为const,但您仍然需要修改该类的特定成员(如互斥锁或您提到的 - 缓存一个值),您让编译器知道这个特定成员是 @ 987654328@,否则会出现编译错误。
【解决方案4】:
大概这是特定于编译器的,但我想大多数编译器会简单地选择总是将具有可变成员的类(整个类)定位到非常量内存中以允许这样做。