我对C ++中的可变变量有了解。
我的问题是记忆力。编译器在内存中存储可变变量的位置?由于它可以修改,所以它不会是只读的#34;记忆肯定。
答案 0 :(得分:3)
mutable
(mutable)只是编译器的类型限定符,如const
或volatile
。
类的成员存储在连续的内存块中(静态内存除外)。如果将成员定义为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
成员,即使阻止对其他成员的更改也是如此。例如,所有对象的成员可能被放置在可修改的内存中,并且只标记了不可变的成员(例如,具有操作系统支持),因此无法在运行时更改它们。
使用可变成员的一个常见原因是存储可重复的昂贵操作的结果(为相同的输入提供相同的结果)。如果不需要结果,则也不需要昂贵的操作。如果需要重复访问结果,那么可变成员允许第一次存储结果,而不是反复执行昂贵的操作。