如果在保持相同类型的同时添加constness,那么static_cast运行时开销是多少?

时间:2015-08-18 09:03:04

标签: c++ pointers const static-cast

如果我有一个指向这个对象的指针,我发现我可以调用一个对象的非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。发现此问题的其他用户可能对提到的问题感兴趣。

1 个答案:

答案 0 :(得分:2)

运行时开销本质上是一个指针副本,可以完全优化。

在您的情况下,我会考虑将int m_i;更改为mutable std::atomic<int> m_i;并使increment在基类中保持不变。它看起来像一个参考计数器,我的方式允许你(i)保留const - 正确性和(ii)线程安全。我还考虑将int更改为unsigned,以避免在m_i变得过大的情况下出现未定义的行为。