1

シナリオ:

struct次のように、すべて宣言された一連のポインターと、restrictこれらのいくつかを引数として取る関数を保持する型があるとstructします。

struct bunch_of_ptr 
{
    double *restrict ptr00;
    double *restrict ptr01;
    ...
    double *restrict ptr19;
}

void evaluate(struct bunch_of_ptr input, struct bunch_of_ptr output) 
{
    // do some calculation on input and return results into output
}

http://www.oracle.com/technetwork/server-storage/solaris10/cc-restrict-139391.htmlによるとinput.ptrXXinput.ptrYY非エイリアスとして扱われます。

質問:

コンパイラはinput.ptrXXandoutput.ptrYYも非エイリアシングとして扱いますか?

4

2 に答える 2

2

そうすべき。どこかとして宣言するすべてのポインターについてrestrict、コンパイラーは、対応するデータへの唯一のアクセスであると想定できます。これらを宣言することにより、実際にコンパイラーに保証を与えます。

すべてのコンパイラがその情報を利用するかどうかは別の問題です。restrictポインターを渡すstructことはあまり一般的ではないため、コンパイラーの動作を確認する必要があります。

于 2015-02-12T13:15:12.807 に答える
-1

あなたのコードにはもっと大きな問題があると思います.関数への入力として2つの構造体変数を値で渡します.

void evaluate(struct bunch_of_ptr input, struct bunch_of_ptr output) 

その結果、構造体のすべてのメンバーがスタックにコピーされます。これは大量の無駄なスタック スペースであり、この関数の多くのオーバーヘッドです。さらに、構造体はマクロのように展開されないため、コンパイラーはここで制限修飾子を無視します。コンパイラーに関する限り、構造体型の 2 つの引数が渡され、エイリアシングについての兆候はありません。

これはおそらくあなたが望んでいたものです:

void evaluate(struct bunch_of_ptr *restrict input, struct bunch_of_ptr *restrict output) 
于 2015-02-12T16:08:26.170 に答える