如果在保持相同类型的同时添加常量,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 变得太大时发生未定义的行为。