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

2番目のケースの方が速いと思いますが、コンパイラがどのように処理するかわからないため、わかりません。あなたはそれについて私に何を言うことができますか?

4

1 に答える 1

9

どちらがより高価ですか?

IME、未定義動作を呼び出すものは、最終的には常によりコストがかかります。

これを新しいプラットフォーム、別のコンパイラ、または新しいバージョンのコンパイラに移植する場合、そのようなコードは爆発する可能性があります。または、他の無邪気なコードが爆発する可能性があります。または、顧客がサポートに電話できない日曜日にのみそうする場合もあります。(彼らは月曜日に電話をかけるので、そのようなコードを書く場合はできるだけ月曜日に離陸する必要があります。)または、上司が近くにいるとき、満月のとき、または月の初め。

コードを高速化する必要がある具体的なケースがあり、プロファイリングを通じてこのコードがボトルネックであることがわかった場合は、実際のアプリケーションと実際のデータを使用して、これが関連するパフォーマンス上の利点をもたらすかどうかを測定します。もしそうなら、神の名においてそれをこの一箇所で使用しますが、あなたが何をしているのか、そしてその理由を説明する非常に目に見えるコメントをそこに置いてください。

于 2012-08-25T19:35:34.933 に答える