据我所知,在C++中具有相同访问控制的struct/class成员以声明顺序存储在内存中。下一个示例mc应该一个接一个地存储:

#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成员是否禁用整个conststruct优化(以某种方式使所有成员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/

10-16 22:47