をuint8_tするため、バイト反転uint64_tを私はバイト順(convert big endian to little endian in C [without using provided func])を逆にする方法を知っている - この場合、私はまた、char型の配列に64ビットのUINTをコピーする方法を知っている__builtin_bswap64コピー配列
を使用したいです理想的にはmemcopy。 (How do I convert a 64bit integer to a char array and back?)
私の問題は、これらの両方の組み合わせです。問題の根底には、私はこのコードを速く代替見つけようとしている:(?またはそれがない)memcopyをソース引数として__builtin_bswap64の結果を負いませんので
carr[33] = ((some64bitvalue >> 56) & 0xFF) ;
carr[34] = ((some64bitvalue >> 48) & 0xFF) ;
carr[35] = ((some64bitvalue >> 40) & 0xFF) ;
carr[36] = ((some64bitvalue >> 32) & 0xFF) ;
carr[37] = ((some64bitvalue >> 24) & 0xFF) ;
carr[38] = ((some64bitvalue >> 16) & 0xFF) ;
carr[39] = ((some64bitvalue >> 8) & 0xFF) ;
carr[40] = (some64bitvalue & 0XFF);
を、私はこれを試してみました:
*(uint64_t *)upub+33 = __builtin_bswap64(some64bitvalue);
が、私は エラーで終わる:割り当て
の左オペランドとして必要な左辺値は、私はすべてで置き換えるしようとしている元のコードの高速化の代替はありますか?
'upub'の種類は何ですか?おそらく厳密なエイリアシング規則に違反している可能性があります。 – user694733
なぜあなたはそれが遅すぎると思いますか?アセンブリコードを見ましたか?プロフィールはありましたか?ポータブルで読みやすいコードを書くことに集中し(例えば、関数内でこれをラップするなど)、スピードの問題がある場合にのみ最適化します。 – Olaf
私はスピードの問題があり、私は "時期尚早の最適化の問題"を認識しています。ここでは適用されません。私の仮定は純粋に直観に基づいていましたが、 '*((uint64_t *)upub + 33)= __builtin_bswap64(some64bitval);に対してベンチマークしました;私の直感は正しいことが分かりました。 – Perlator