采用这种结构:
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
我认为第二种情况更快,但我不确定,因为我不知道编译器将如何处理它。你可以告诉我什么呢?
答案 0 :(得分:9)
哪个更贵?
IME,调用 未定义行为 的人最终总是更加昂贵。
如果要将其移植到某个新平台,或其他编译器或新版本的编译器, 此类代码可能会爆炸 。或者它可能使一些其他的,无辜的代码爆炸。或者它可能只在星期天,当您的客户无法拨打支持时这样做。 (他们会在星期一打电话,所以如果你写这样的代码,你应该尽可能经常在星期一起飞。)或者它可能只在你的老板在周围,或满月时,或在建立在本月的第一天。
如果你有一些 具体案例 ,你需要加速一些代码,而你找到了 通过分析 ,这段代码是瓶颈,然后 衡量这是否带来任何相关的性能优势 , 使用您的真实应用 和真实数据。如果确实如此,那么以上帝的名义在这个地方使用 ,但在那里放一些非常明显的评论,解释你做了什么以及为什么。