对同一(原始)类型的static_cast是否产生任何代码?

时间:2011-04-28 06:15:14

标签: c++ casting

我想这一切都在标题中说...

但这是一个例子。给定

void functionThatTakesAFloat(float par);
float f = 3.5f;

确实

functionThatTakesAFloat(static_cast<float>(f));

相比,

生成任何附加代码

functionThatTakesAFloat(f);

或编译器是否完全消除了这个static_cast

编辑: 我正在使用VC ++(2010)

3 个答案:

答案 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)

这里的简单答案是,根据定义,从floatfloat的演员阵容是无操作。没有可想象的代码值得为这个演员阵容发光。在这种情况下,这个Universe中的某些编译器可能会发出毫无疑问的冗余代码,但可以安全地假设您永远不会遇到这样的编译器。

答案 2 :(得分:0)

理想情况下,编译器不应为任何转换操作(dynamic_cast<>除外)生成额外的代码,尤其是对于这种基本类型。