【发布时间】:2013-04-01 00:10:29
【问题描述】:
int a = (int)5;
VS 是否对此进行了优化(移除演员表)?上面的情况很简单,但我正在编写一些模板类,它们在构造函数中采用任意类型参数:
template <typename U>
MyClass(U argument)
{
T a = (T)argument;
}
在大多数情况下,需要强制转换以避免编译器警告,但是当 T = U 时,强制转换是多余的。或者也许有更好的方法来实现它?
【问题讨论】:
-
写下来,编译它并查看IL(使用ILDASM或像Reflector这样的反编译器)。
-
如果您需要演员表,请使用 c++ 演员表而不是 c 风格的演员表。在 c++ 中,当您使用
(T)x时,编译器实际上会尝试使用预定义的 C++ 强制转换集,它实际上可能最终使用reinterpret_cast。 -
如果你真的很担心,你仍然可以包含
<type_traits>并写一些类似T a = std::is_same<T,U>::value ? arg : (U) arg;的东西——虽然老实说这有点傻。 -
@Damon 我唯一可能“担心”的是演员阵容的开销。您的解决方案不会增加不同的(但仍然是)开销吗?
-
编译输出中没有演员表;不可能。想一想:在 C++ 中,将使用的强制转换必须在编译时确定,并且编译器必须同时具有操作数和结果的类型。编译器使用这些类型来选择它需要输出的确切操作。一旦编译器决定您要求从
int到int的静态转换,编译器就没有什么可做的了。不存在将int转换为int的代码片段。
标签: c++ visual-studio optimization