如果我有一个指向这个对象的指针,我发现我可以调用一个对象的非const函数,这让我感到很恼火。我不能让指针成为const指针,因为我还需要调用非const函数。因此,我唯一的选择似乎是执行static_casts以确保constness也适用于指针。这是一个最小的例子:
class MyClassImpl
{
MyClassImpl(void) : m_i(0) {}
int increment(void) {
++m_i;
return m_i;
}
private:
int m_i;
};
class MyClass
{
MyClass(void) : m_pImpl(new MyClassImpl()){}
~MyClass(void) {
delete m_pImpl;
}
int doNothing(void) const {
m_pImpl->increment(); // works although MyClassImpl::increment() is non-const
// static_cast<const MyClassImpl *>(m_pImpl)->increment(); // this will not compile because of non-constness
}
private:
MyClass(const MyClass & rhs);
MyClassImpl * m_pImpl;
};
但是,我想知道static_cast在运行时是否有任何成本。 static_casts是否在编译时完全评估,或者是否有一些开销,假设经常调用doNothing()。
编辑: 我的问题与C++ static_cast runtime overhead不同,因为在我的情况下,static_cast只添加const。发现此问题的其他用户可能对提到的问题感兴趣。
答案 0 :(得分:2)
运行时开销本质上是一个指针副本,可以完全优化。
但在您的情况下,我会考虑将int m_i;
更改为mutable std::atomic<int> m_i;
并使increment
在基类中保持不变。它看起来像一个参考计数器,我的方式允许你(i)保留const
- 正确性和(ii)线程安全。我还考虑将int
更改为unsigned
,以避免在m_i
变得过大的情况下出现未定义的行为。