#pragma disjoint ディレクティブは、その使用スコープ内で互いに 別名ではない ID をリストします。
.----------------------. V | >>-#--pragma--disjoint--(--+---+--identifier----,--+---+--identifier-+--)->< '-*-' '-*-'
このディレクティブはリストされているどの 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 の値を持っていると想定することができるため、メモリーから変数を再ロードしません。
関連情報