【问题标题】:What is the static_cast runtime overhead if adding constness while keeping the same type?如果在保持相同类型的同时添加常量,那么 static_cast 运行时开销是多少?
【发布时间】:2015-08-18 09:03:03
【问题描述】:

如果我有一个指向该对象的指针,我可以调用该对象的非常量函数,这很烦人。我不能让指针成为 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 在运行时是否有任何成本。假设 doNothing() 经常被调用,static_casts 是在编译时完全评估还是有一些开销。

编辑: 我的问题与C++ static_cast runtime overhead 不同,因为在我的情况下,static_cast 只添加了 const。发现此问题的其他用户可能对上述问题感兴趣。

【问题讨论】:

  • 开销取决于类型。如果只添加 const,则没有 Overhead。
  • 为什么是static_cast 而不是const_cast
  • @nwp:static_cast 可以添加 constness 但不会删除它。一个 const_cast 可以删除 constness。因此,static_cast 更安全。

标签: c++ pointers constants static-cast


【解决方案1】:

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

但是在您的情况下,我会考虑将 int m_i; 更改为 mutable std::atomic&lt;int&gt; m_i; 并在基类中使 increment 保持不变。它看起来像一个引用计数器,我的方式允许您(i)保留const-正确性和(ii)线程安全。如果m_i 太大,我也会考虑将int 更改为unsigned 以避免未定义的行为。

【讨论】:

  • 为什么要复制指针?在这种情况下,只有const-qualification 会发生变化,因此很可能是空操作。
  • 确实,编译器可能会优化出一个临时的。但它并不比指针副本更糟糕
猜你喜欢
  • 2013-10-07
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多