#pragma disjoint ディレクティブは、その使用スコープ内で互いに別名ではない ID をリストします。
このディレクティブは、リストされている ID はどれも、同じ物理ストレージを共用していない (これによって、さらに最適化の機会が提供されます) ことをコンパイラーに通知します。 ID のいずれかが実際に物理ストレージを共用している場合は、プラグマが原因でプログラムが間違った結果を出す場合があります。
ディレクティブの中の ID は、プログラム中のプラグマが現れる点では可視でなくてはなりません。disjoint 名前リスト内の ID は、次のいずれも参照できません。
このプラグマは、-qignprag コンパイラー・オプションによって使用不可にできます。
int a, b, *ptr_a, *ptr_b; #pragma disjoint(*ptr_a, b) // *ptr_a never points to b #pragma disjoint(*ptr_b, a) // *ptr_b never points to a void one_function() { b = 6; *ptr_a = 7; // Assignment does not alter the value of b another_function(b); // Argument "b" has the value 6 }
外部ポインター ptr_a は、外部変数 b とメモリーを共用せず、また外部変数を指し示すこともありません。したがって、ptr_a が指し示すオブジェクトに 7 を代入しても、b の値は変わりません。同様に、外部ポインター ptr_b は、外部変数 a とメモリーを共用せず、またそれを指し示すこともありません。コンパイラーは、another_function の引き数の値を 6 と見なすことができるので、メモリーから変数を再ロードしません。