据我所知,在C++中具有相同访问控制的struct/class成员以声明顺序存储在内存中。下一个示例m
和c
应该一个接一个地存储:
#include <cstdlib>
#include <iostream>
struct X
{
mutable int m;
int c;
};
const X cx = {0, 1};
int main()
{
X& x = const_cast<X&>(cx);
x.m = rand();
x.c = rand();
std::cout<<x.m<<" "<<x.c;
}
在此示例中,程序运行并打印2个随机数。如果我删除
mutable
,它会崩溃,因为cx
存储在只读 protected 内存中。这让我想知道-一个
mutable
成员是否禁用整个const
的struct
优化(以某种方式使所有成员mutable
)?是否可以将
struct
的一部分存储在只读内存中,而将其他部分存储在非只读内存中,并遵守C++标准内存布局?这已在Windows 7上使用Visual Studio 2010和在Ubuntu上使用GCC 4.7.2进行了测试。
最佳答案
要解释为什么在涉及struct
的存储位置时编译器必须“全部或不执行”:在大多数处理器中,内存页面为4KB(少数具有8KB页面)。那是“只读”与“读/写”存储块的粒度。因此,只读存储器中不能有一个4字节整数,然后读写存储器中不能有下一个4字节整数(除非它们正好跨越4KB存储器边界-但这肯定会浪费相当多的内存)内存(如果您有3000个阵列,则占用12MB)。
请注意,这不是“优化”。只读内存并不比读写内存快。这是为了防止用户对const
傻傻地写他们不应该写的数据。
同样,如果您在struct
中添加了一个“做某事”的构造函数,则它很可能会将结构存储在读写内存中,因为编译器生成在运行时打开和关闭只读代码的技巧非常棘手。
关于c++ - 可变成员是否为非可变成员禁用const优化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18586189/