可变的可变内存位置

时间:2015-08-16 05:11:14

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

我对C ++中的可变变量有了解。

  1. 它是一个特殊的存储类。
  2. 可变变量可以由常量对象修改。
  3. 除非特别要求,否则您希望使用可变变量的情况下,您不希望执行昂贵的操作来获取结果。如果特别询问,您的程序将执行一次操作并将结果缓存到可变变量中。
  4. 我的问题是记忆力。编译器在内存中存储可变变量的位置?由于它可以修改,所以它不会是只读的#34;记忆肯定。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

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

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

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