我想这一切都在标题中说...
但这是一个例子。给定
void functionThatTakesAFloat(float par);
float f = 3.5f;
确实
functionThatTakesAFloat(static_cast<float>(f));
与相比,生成任何附加代码
functionThatTakesAFloat(f);
或编译器是否完全消除了这个static_cast
?
编辑: 我正在使用VC ++(2010)
答案 0 :(得分:10)
5.2.9 /
-2- An expression e can be explicitly converted to a type T
using a static_cast of the form static_cast<T>(e) if the
declaration ``"T t(e);"'' is well-formed, for some invented
temporary variable t (dcl.init). The effect of such an explicit
conversion is the same as performing the declaration and
initialization and then using the temporary variable as the
result of the conversion. <cont...>
所以给出:
float my_float = ...;
...这...
f(static_cast<float>(my_float));
......必须等同于......
float temp = my_float;
f(temp);
它是否实际上遵循了字面意义,并在非优化构建中生成临时值,将取决于编译器。如果您不相信您的优化器会删除它(如果它曾被插入),那么您应该尝试另一个编译器...; - )。
答案 1 :(得分:6)
这里的简单答案是,根据定义,从float
到float
的演员阵容是无操作。没有可想象的代码值得为这个演员阵容发光。在这种情况下,这个Universe中的某些编译器可能会发出毫无疑问的冗余代码,但可以安全地假设您永远不会遇到这样的编译器。
答案 2 :(得分:0)
理想情况下,编译器不应为任何转换操作(dynamic_cast<>
除外)生成额外的代码,尤其是对于这种基本类型。