c – 可以将static_cast引用到相同类型的引入运行时开销吗?

我有一个结构模板,它有两种类型(T和S),在某种程度上使用一个static_cast从一种类型转换为另一种类型.通常情况下,T和S是相同的类型.

一个简化的设置示例:

template <typename T,typename S = T>
struct foo
{
  void bar(T val)
  {
    /* ... */
    some_other_function(static_cast<S>(val));
    /* ... */
  }
};

在S与T相同的情况下,static_cast是否或可以引入额外的开销,还是一个总是被忽略的空操作?

如果它引入了开销,是否有一个简单的模板元编程技巧来执行static_cast只有在需要的时候,还是需要创建一个部分专业化来处理T == S的情况?如果可能,我宁愿避免整个foo模板的部分专业化.

解决方法

是的,它可以.

这是一个例子:

struct A {
  A( A const& ) {
    std::cout << "expensive copy\n";
  }
};

template<typename T>
void noop( T const& ) {}
template <typename T,typename S = T>
void bar(T val)
{
  noop(static_cast<S>(val));
}
template <typename T>
void bar2(T val)
{
  noop(val);
}
int main() {
  std::cout << "start\n";
  A a;
  std::cout << "bar2\n";
  bar2(a); // one expensive copy
  std::cout << "bar\n";
  bar(a); // two expensive copies
  std::cout << "done";
}

基本上,static_cast可以引发一个复制构造函数调用.

对于某些类型(如int),复制构造函数基本上是空闲的,编译器可以消除它.

对于其他类型,它不能.在这种情况下,copy elision也不合法:如果您的副本构造函数具有副作用或编译器无法证明它没有副作用(如果复制构造函数不常见),它将被调用.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...