如果在保持相同类型的同时添加常量,static_cast 运行时开销是多少?
What is the static_cast runtime overhead if adding constness while keeping the same type?
如果我有一个指向该对象的指针,我可以调用该对象的非常量函数,这让我很恼火。我不能让指针成为 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 只添加了常量。发现此问题的其他用户可能对上述问题感兴趣。
运行时开销本质上是一个指针副本,可以完全优化掉。
但是 在你的情况下,我会考虑将 int m_i;
更改为 mutable std::atomic<int> m_i;
并使 increment
在基础 [=23] 中保持不变=] 也是。它看起来像一个参考计数器,我的方法允许您 (i) 保持 const
-正确性和 (ii) 线程安全。我还会考虑将 int
更改为 unsigned
以避免在 m_i
变得太大时发生未定义的行为。
如果我有一个指向该对象的指针,我可以调用该对象的非常量函数,这让我很恼火。我不能让指针成为 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 只添加了常量。发现此问题的其他用户可能对上述问题感兴趣。
运行时开销本质上是一个指针副本,可以完全优化掉。
但是 在你的情况下,我会考虑将 int m_i;
更改为 mutable std::atomic<int> m_i;
并使 increment
在基础 [=23] 中保持不变=] 也是。它看起来像一个参考计数器,我的方法允许您 (i) 保持 const
-正确性和 (ii) 线程安全。我还会考虑将 int
更改为 unsigned
以避免在 m_i
变得太大时发生未定义的行为。