ポインターがエイリアスされていないことをCまたはC ++コンパイラに伝える方法

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

質問

私は次のようなポインターの配列を受信する関数を持っています:

void foo(int *ptrs[], int num, int size)
{ 
  /* The body is an example only  */
     for (int i = 0; i < size; ++i) { 
       for (int j = 0; j < num-1; ++j)
         ptrs[num-1][i] += ptrs[j][i];
     }
}

コンパイラに伝えたいのは、ポインターが ptrs[i] お互いのエイリアスではなく、アレイ ptrs[i] 重複しないでください。どうやってこれをしますか?私の不純な動機は、自動ベクトル化を促進することです。

また、同じ効果を得る方法はありますか __restrict__ aの反復器に std::vector ?

役に立ちましたか?

解決

restrict, 、より一般的なものとは異なります const, 、のプロパティです ポインター ではなく 指されたデータ. 。したがって、それはに属します の側面*'宣言者モジー剤。 [] パラメーター宣言には、書く別の方法があります *. 。これらのことをまとめると、この関数プロトタイプで必要な効果を得ることができるはずです。

void foo(int *restrict *restrict ptrs, int num, int size)
{
   /* body */
}

そして、新しい名前は必要ありません。 (テストされていません。走行距離は異なる場合があります。 restrict 純粋な最適化のヒントであり、実際にコンパイラで建設的なことをしないかもしれません。)

他のヒント

何かのようなもの:

void foo(int *ptrs[], int num, int size)
{ 
  /* The body is an example only  */
     for (int i = 0; i < size; ++i) { 
       for (int j = 0; j < num-1; ++j) {
         int * restrict a = ptrs[num-1];
         int * restrict b = ptrs[j];
         a[i] += b[i];
     }
}

... C99でそれをするべきだと思います。 C ++には方法はないと思いますが、多くのC ++コンパイラも制限をサポートしています。

C ++では、根本的に異なるタイプを指している場合、ポインター引数はエイリアスではないと想定されています(「厳密なエイリアシング」ルール)。

C99では、「制限」キーワードは、ポインター引数が他のポインター引数をエイリアスしないことを指定します。

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