我有一个结构模板,它采用两种类型(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
是否会引入额外的开销,或者它是否为 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/