reinterpret_cast一个对象

时间:2012-08-25 19:29:09

标签: c++ casting compilation reinterpret-cast

采用这种结构:

struct Foo
{
    float m_foo;
    // no other member
};

// A Foo object.
Foo f;

哪个更贵?

float result = std::sin(f.m_foo);

float result = std::sin(*(reinterpret_cast<float*>(&f)));
// f can be interpreted like float in this case

我认为第二种情况更快,但我不确定,因为我不知道编译器将如何处理它。你可以告诉我什么呢?

1 个答案:

答案 0 :(得分:9)

  

哪个更贵?

IME,调用 未定义行为 的人最终总是更加昂贵。

如果要将其移植到某个新平台,或其他编译器或新版本的编译器, 此类代码可能会爆炸 。或者它可能使一些其他的,无辜的代码爆炸。或者它可能只在星期天,当您的客户无法拨打支持时这样做。 (他们会在星期一打电话,所以如果你写这样的代码,你应该尽可能经常在星期一起飞。)或者它可能只在你的老板在周围,或满月时,或在建立在本月的第一天。

如果你有一些 具体案例 ,你需要加速一些代码,而你找到了 通过分析 ,这段代码是瓶颈,然后 衡量这是否带来任何相关的性能优势 使用您的真实应用 和真实数据。如果确实如此,那么以上帝的名义在这个地方使用 ,但在那里放一些非常明显的评论,解释你做了什么以及为什么。