8

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

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__また、?のイテレータと同じ効果を得る方法はありstd::vectorますか?

4

3 に答える 3

9

restrict、は、より一般的なものとは異なり、が指すデータではなく、ポインタconstのプロパティです。したがって、これは' 'declarator-modifierの右側に属します。パラメータ宣言では、を書く別の方法です。これらを組み合わせると、この関数プロトタイプで必要な効果を得ることができるはずです。*[]*

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

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

于 2011-09-07T03:24:50.977 に答える
7

何かのようなもの:

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++コンパイラもrestrictをサポートしています。

于 2011-09-07T03:13:05.793 に答える
4

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

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

于 2011-09-07T03:11:58.913 に答える