タグ付けされた質問 「strict-aliasing」


3
このポインタを使用すると、ホットループで奇妙な最適化が解除されます
最近、奇妙な最適化解除に遭遇しました(または最適化の機会を逃しました)。 3ビット整数の配列を8ビット整数に効率的にアンパックするには、この関数を検討してください。ループの繰り返しごとに16の整数をアンパックします。 void unpack3bit(uint8_t* target, char* source, int size) { while(size > 0){ uint64_t t = *reinterpret_cast<uint64_t*>(source); target[0] = t & 0x7; target[1] = (t >> 3) & 0x7; target[2] = (t >> 6) & 0x7; target[3] = (t >> 9) & 0x7; target[4] = (t >> 12) & 0x7; …

13
C ++では、わざわざ変数をキャッシュするか、コンパイラーに最適化を行わせる必要がありますか?(エイリアシング)
次のコードを考えてみてください(これpは型unsigned char*でbitmap->widthあり、整数型であり、正確には不明であり、使用している外部ライブラリのバージョンに依存します)。 for (unsigned x = 0; x < static_cast<unsigned>(bitmap->width); ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } それを最適化する価値があります[..] これにより、次のように書くことでより効率的な結果が得られる場合があります。 unsigned width(static_cast<unsigned>(bitmap->width)); for (unsigned x = 0; x < width; ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } ...または、コンパイラが最適化するのは簡単ですか? 「より良い」コードは何だと思いますか? 編集者からのメモ(Ike):取り消しテキストについて疑問に思っている方のために、元の質問は、フレーズどおり、トピックから外れた領域に危険なほど近く、肯定的なフィードバックにもかかわらず非常に閉じていました。これらは打たれました。ただし、質問のこれらの被害を受けたセクションに対応した回答者を罰しないでください。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.