Oracle Solaris Studio 12.2: C ユーザーガイド

B.2.72 -xalias_level[= l]

コンパイラで -xalias_level オプションを使用して、型に基づく別名の解析による最適化でのレベルを指定します。このオプションは、コンパイル対象の変換ユニットで、指定した別名レベルを有効にします。

-xalias_level コマンドを発行しない場合、コンパイラは -xalias_level=any を仮定します。値を設定しないで -xalias_level を指定する場合、デフォルトは -xalias_level=layout になります。

-xalias_level オプションを使用するには、-xO3 以上の最適化レベルが必要です。最適化がこれよりも低く設定されている場合は、警告が表示され、-xalias_level オプションは無視されます。

-xalias_level オプションを発行しても、別名レベルごとに記述されている規則と制限を遵守しない場合、プログラムが未定義の動作をします。

l を次の表のいずれかの用語で置き換えます。

表 B–13 別名明確化のレベル

フラグ 

意味  

any

コンパイラは、すべてのメモリー参照がこのレベルで別名設定できると仮定します。-xalias_level=any レベルで型に基づく別名分析は行われません。

basic

-xalias_level=basic オプションを使用する場合、コンパイラは、さまざま な C 言語基本型を呼び出すメモリー参照が相互に別名設定しないと仮定します。また、コンパイラは、ほかのすべての型への参照が C 言語基本型と同様に相互に別名設定できると仮定します。コンパイラは、char * を使用する参照がそのほかの型を別名設定できると仮定します。

たとえば、-xalias_level=basic レベルにおいて、コンパイラは、int * 型のポインタ変数が float オブジェクトにアクセスしないことを仮定します。そのため、コンパイラは、float * 型のポインタが int * 型のポインタで参照される同一メモリーを別名設定しないと仮定する最適化を実行すると安全です。

weak

-xalias_level=weak オプションを使用する場合、コンパイラは、任意の構造体ポインタが構造体の型にポイントできると仮定します。

コンパイルされるソースの式で参照されるか、コンパイルされるソースの外側から参照される型への参照を保持する構造体または共用体は、コンパイルされるソースの式より先に宣言しなければいけません。 

この制限事項を遵守するには、コンパイルされるソースの式で参照されるオブジェクトの型を参照する型を含むプログラムの全ヘッダーファイルを取り込みます。 

-xalias_level=weak レベルで、コンパイラは、さまざまな C 言語基本型に関連するメモリー参照が相互に別名設定しないと仮定します。コンパイラは、char * を使用する参照がそのほかの型に関連するメモリー参照を別名設定すると仮定します。

layout

-xalias_level=layout オプションを使用すると、コンパイラは、メモリー内に同一の型のシーケンスを保持する型に関連するメモリー参照が相互に別名設定できると仮定できます。

コンパイラは、メモリーで同一に見えない型を保持する 2 つの参照が相互に別名設定しないと仮定します。コンパイラは、構造体の初期メンバーがメモリーで同じに見える場合、さまざまな構造体の型の別名を介して 2 つのメモリーがアクセスを実行すると仮定します。ただし、このレベルで、構造体へのポインタを使用して、2 つの構造体の間にあるメモリーで同じに見えるメンバーの一般的な初期シーケンスの外側にある類似しない構造体オブジェクトのフィールドにアクセスすべきではありません。そのような参照が相互に別名設定しないとコンパイラが仮定しているからです。 

-xalias_level=layout オプションを使用すると、コンパイラは、メモリー内に同一の型のシーケンスを保持する型に関連するメモリー参照が相互に別名設定できると仮定できます。コンパイラは、char * を使用する参照がそのほかの型に関連するメモリー参照を別名設定できると仮定します。

strict

-xalias_level=strict オプションを使用すると、コンパイラは、タグを削除したときに同一となるメモリー参照 (構造体や共用体などの型に関連するもの) が相互に別名設定できると仮定します。逆に言えば、コンパイラは、タグを削除したあとも同一にならない型に関連するメモリー参照は相互に別名設定しないと仮定します。

ただし、コンパイルされるソースの式で参照されるか、コンパイルされるソースの外側から参照されるオブジェクトの一部となる型への参照を含む構造体または共用体の型は、コンパイルされるソースの式より先に宣言しなければいけません。 

この制限事項を遵守するには、コンパイルされるソースの式で参照されるオブジェクトの型を参照する型を含むプログラムの全ヘッダーファイルを取り込みます。-xalias_level=strict レベルで、コンパイラは、さまざまな C 言語基本型に関連するメモリー参照が相互に別名設定しないと仮定します。コンパイラは、char * を使用する参照がそのほかの型を別名設定できると仮定します。

std

-xalias_level=std オプションを使用する場合、コンパイラは、型とタグが別名に対し同一でなくてはならないが、char * を使用する参照がそのほかの型を別名設定できると仮定します。この規則は、1999 ISO C 規格に記載されているポインタの参照解除についての制限事項と同じです。この規則を正しく使用するプログラムは移植性が非常に高く、最適化によって良好なパフォーマンスが得られるはずです。

strong

-xalias_level=strong オプションを使用する場合、std レベルと同じ規則が適用されますが、それに加えて、コンパイラは、型 char * のポインタを使用する場合にかぎり、型 char のオブジェクトにアクセスできると仮定します。また、コンパイラは、内部ポインタが存在しないと仮定します。内部ポインタは、構造体のメンバーをポイントするポインタとして定義されます。