2014-07-24 51 views
4

在C++中,您现在可以拥有mutable成员。这为语言增加了一层“逻辑常量”。这些与只读数据有何关系 - 将会有一个mutable成员阻止将一个const类放入.rodata节中?修改const对象的可变成员是否有效?

class Foo { 
    mutable int bar; 

public: 
    Foo(): bar(0) {} 
    void set(int x) const { bar = x; } 
}; 

// Can this be in a read-only section? 
const Foo foo; 

int main(void) 
{ 
    // Is this well-defined? 
    foo.set(5); 
} 
+0

这就是'mutable'是O_O你似乎已经知道被发现。 – BartoszKP

+0

是的。还有什么可以'可变'工作? – Deduplicator

+1

为什么逻辑上只有const的对象位于'.rodata'节中? –

回答

5

是的,你被允许修改const对象的可变成员,这是在draft C++ standard部分覆盖7.1.1存储类声明它说:

类的数据成员上的可变符取消应用于包含类对象的const 说明符,并允许 修改可变类成员,即使对象的其余部分为const(7.1.6.1)。

Technical Report on C++ Performance部分7.1ROMability覆盖情况下,当一个编译器可以把数据在只读存储器。在这种情况下这将是不可能的,因为它显然不是一成不变:

因此ROMability的受试者具有性能应用到所有 程序,其中所述程序的不可变的部分可以被放置在一个 共享,只读只有空间。

+0

谢谢,所以可变成员会将整个类转换为“逻辑常量”,而不是C/C++的传统“按位常量”。 –

+1

@KevinCox如果有人告诉你const4是关于物理只读内存的话,那么你被严重误导了。从来没有“按位常量”的含义,constness只是编译器强制执行的逻辑/概念上的事情。 “按位常量”的概念最接近标准所称的常量表达式和文字类型(这也是该性能-TR中非正式描述的内容)。简而言之,常量表达式是可ROMable的,其他的都不是。没有'constexpr'说明符,编译器仍然可以尝试形成常量表达式,但不是必需的。 –

2

mutable可以在const方法中修改成员,并且很可能会删除该对象的ROMability。还有其他要求可以制作一个ROMable类的实例。详情可Techincal Report on C++ Perfomance第7章和here

相关问题