c++ - static_cast 到相同类型会引入运行时开销吗?

标签 c++ overhead static-cast

我有一个结构模板,它采用两种类型(TS),并且在某些时候使用 static_cast 从一种类型转换键入另一个。通常情况下,TS 是同一类型。

设置的简化示例:

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

ST 是同一个类的情况下,static_cast 是否会引入额外的开销,或者它是否为 null哪个操作总是会被忽略?

如果它确实引入了开销,是否有一个简单的模板元编程技巧来仅在需要时执行 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),复制构造函数基本上是免费的,编译器可以消除它。

对于其他类型,它不能。在这种情况下,复制省略也不合法:如果您的复制构造函数有副作用,或者编译器无法证明它没有副作用(如果复制构造函数不平凡,则很常见),它将被调用。

关于c++ - static_cast 到相同类型会引入运行时开销吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19106826/

相关文章:

c++11 - 在 C++ 中将 NULL 转换为 SomeType* 有什么用?

c++ - 如何在 gmock 中测试失败

c++ - 调用了错误的模板函数

C++ 如何强制预取数据缓存? (数组循环)

c++ - VTK:直到用户交互后 View 才会更新

c++ - 内存 [取消] 分配成本和潜在的编译器优化 (c++)

c++ - 几乎 pod 数据的 reinterpret_cast(布局兼容性是否足够)

function - 什么更贵?上下文切换还是函数调用?

objective-c - iOS:调用 Objective-C 方法的处理开销是多少?

c++ - 为什么我不能使用从一个 Xalan 类到它的基类的 static_cast?