0

現在、エンディアンを変更するためにデータのバイトをスワップするこの関数があります。

template<typename Type, unsigned int Half = sizeof(Type)/2, unsigned int End = sizeof(Type)-1> 
inline void swapBytes(Type& x)
{
    char* c = reinterpret_cast<char*>(&x);
    char tmp;
    for (unsigned int i = 0; i < Half; ++i) {
        tmp = c[i];
        c[i] = c[End-i];
        c[End-i] = tmp;
    }
}

この関数は、私のアルゴリズムによって数百万回呼び出されます。したがって、回避できるすべての命令は良いことです。

私の質問は次のとおりです。この関数を最適化するにはどうすればよいですか?

4

1 に答える 1

0

まず、ハードウェア プラットフォームにバイト スワップ命令があるかどうかを確認する必要があります。一部のプラットフォームにはこれらの手順があり、一部のプラットフォームにはありません。その後、それらを使用するライブラリ関数を探す必要があります。ドキュメントを確認するか、デバッガーを停止して逆アセンブリを確認してください。見つけられるチャンスです。これよりもうまく機能するものは他にないでしょう。

最終的には、これらの命令を使用する独自の関数をアセンブラーで記述します。

2 バイト型の場合、ストレート テーブル変換が機能します。これは 128 kb であり、現在のコンピューターではそれほど大きくありません。32 ビット タイプの場合、これはやり過ぎに近いですが、いくつかの (まれな) ケースでは、大きな 64 ビット ボックスでも動作することがあります。

また、asm 命令、テーブル変換、最適化ループを組み合わせて使用​​することもできます。

于 2012-10-03T02:24:45.047 に答える