1

SSE2組み込み関数を使用して、8x16ビットベクトルの転置関数を作成しています。その関数には 8 つの引数 (8x8x16 ビット サイズの行列) があるため、参照で渡す以外に何もできません。それはコンパイラによって最適化されますか (つまり、これらの __m128i オブジェクトはスタックではなくレジスタで渡されますか)?

コードスニペット:

inline void transpose (__m128i &a0, __m128i &a1, __m128i &a2, __m128i &a3,
                       __m128i &a4, __m128i &a5, __m128i &a6, __m128i &a7) {
    ....
    }
4

3 に答える 3

3

誰が言えるの?

コンパイルして逆アセンブルを見てみませんか?それが確実な唯一の方法です。

于 2010-04-26T15:45:00.860 に答える
2

スタックにプッシュされない可能性があります。関数がインラインの場合、コンパイラーは、呼び出し元から呼び出し先にデータを渡す代わりに、呼び出された関数から呼び出し先関数に操作(コード)を実際にプッシュします。

インラインはヒントなので、コンパイラは実際に呼び出しをインライン化しないことを決定できます。その後、Zanのアドバイスに従い、コンパイルされたコードがどのように見えるかを実際に確認する必要があります。

于 2010-04-26T16:19:56.980 に答える
0

この制限は、Windows と MSVC(++) にのみ適用されることに注意してください (おそらく、それに応じて質問にタグを付ける必要があります)。

C++ と参照でこれを試したことはありませんが、このようなインラインで MSVC とポインターを使用すると、コンパイラーは間接性を最適化するように見えます。おそらく同じことがC++参照にも当てはまりますが、別のポスターが指摘したように、生成されたコードを見て確認する必要があります。

于 2010-04-26T16:12:54.240 に答える