インライン関数を参照して__m128iオブジェクトを渡すと、これらのオブジェクトがスタックに移動されますか?

StackOverflow https://stackoverflow.com/questions/2714749

  •  01-10-2019
  •  | 
  •  

質問

SSE2内因性を備えた8x16ビットベクトルのTranspose関数を書いています。その関数(8x8x16ビットサイズのマトリックス)には8つの引数があるため、参照して渡す以外に何もできません。それはコンパイラによって最適化されますか(つまり、これらの__m128iオブジェクトはスタックの代わりにレジスタで渡されますか)?

コードスニペット:

inline void transpose (__m128i &a0, __m128i &a1, __m128i &a2, __m128i &a3,
                       __m128i &a4, __m128i &a5, __m128i &a6, __m128i &a7) {
    ....
    }
役に立ちましたか?

解決

彼らはスタックに押し込まれない可能性があります。関数がインラインである場合、コンパイラは実際に操作(コード)を呼び出している関数からCallee関数に押し込みます。

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

他のヒント

誰が言えるの?

コンパイルして、分解を見てみませんか?それが確かに唯一の方法です。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top