0

采用这个结构:

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

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

4

1 回答 1

9

哪个更贵?

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

如果你想把它移植到某个新平台,或者另一个编译器,或者你的编译器的新版本,这样的代码可能会崩溃。或者它可能会使其他一些看起来很无辜的代码爆炸。或者它可能只在周日这样做,因为您的客户无法致电支持。(他们会在星期一打电话,所以如果你写这样的代码,你应该尽可能多地在星期一起飞。)或者它可能只在你的老板在附近,或者在满月,或者在编译器版本构建的时候这样做。月初。

如果您有一些具体案例需要加速某些代码,并且通过 profiling发现这段代码是一个瓶颈,那么请使用您的真实应用程序和真实数据来衡量这是否会带来任何相关的性能优势。如果是这样,那么以上帝的名义在这个地方使用它,但要在那里放一些非常明显的评论,解释你做了什么以及为什么。

于 2012-08-25T19:35:34.933 回答