reinterpret_cast一个对象

Luc*_*ima 0 c++ casting compilation reinterpret-cast

采用这种结构:

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

// A Foo object.
Foo f;
Run Code Online (Sandbox Code Playgroud)

哪个更贵?

float result = std::sin(f.m_foo);
Run Code Online (Sandbox Code Playgroud)

要么

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

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

sbi*_*sbi 9

哪个更贵?

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

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

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

  • 它真的是未定义的行为吗?`Foo`是POD并且根据c ++ 11标准中的`§9.2.21`:`指向标准布局结构对象的指针,适合使用reinterpret_cast转换为其初始成员`.因此,我没有看到问题中的代码是如何UB的(显然没有理由使用这样的代码,但这不是重点). (2认同)