(SPARC) C++ コンパイラで次のコマンドを指定して、型に基づく別名の解析および最適化を実行することができます。
-xalias_level[=n ]
ここで、n には any、simple、compatible のいずれかを指定します。
-xalias_level=any
このレベルの解析では、ある型を別名で定義できるとものとして処理されます。ただしこの場合でも、一部の最適化が可能です。
-xalias_level=simple
単純型は別名で定義されていないものとして処理されます。次の単純型のいずれかの動的な型である記憶オブジェクトの場合を説明します。
char |
short int |
long int |
float |
signed char |
unsigned short int |
unsigned long int |
double |
unsigned char |
int |
long long int |
long double |
wchar_t |
unsigned int |
unsigned long long int |
enumeration types |
データポインタ型 |
関数ポインタ型 |
データメンバーのポインタ型 |
関数メンバーのポインタ型 |
これらは、次の型の lvalue を使用してだけアクセスされます。
オブジェクトの動的な型
オブジェクトの動的な型を constant または volatile で修飾したもの。つまり、オブジェクトの動的な型に相当する符号付きまたは符号なしの型。
オブジェクトの動的な型を constant または volatile で修飾したものに相当する、符号付きまたは符号なしの型。
前述の型のいずれかがメンバーに含まれる集合体または共用体 (再帰的に、その下位の集合体またはそれに含まれる共用体のメンバーについても該当します)。
char 型または unsigned char 型
-xalias_level=compatible
配置非互換の型は、別名で定義されていないものとして処理されます。記憶オブジェクトは、次の型の lvalue を使用してだけアクセスされます。
オブジェクトの動的な型
オブジェクトの動的な型を constant または volatile で修飾したもの。つまり、オブジェクトの動的な型に相当する符号付きまたは符号なしの型。
オブジェクトの動的な型を constant または volatile で修飾したものに相当する、符号付きまたは符号なしの型。
前述の型のいずれかがメンバーに含まれる集合体または共用体 (再帰的に、その下位の集合体またはそれに含まれる共用体のメンバーについても該当します)。
オブジェクトの動的な型の (多くの場合は constant または volatile で修飾した) 基本クラス型。
char 型または unsigned char 型
コンパイラでは、すべての参照の型が、相当する記憶オブジェクトの動的な型と配置互換であるものと見なされます。2 つの型は、次の条件の場合に配置互換になります。
2 つの型が同一の型の場合は、配置互換になります。
2 つの型の違いが、修飾が constant か volatile かの違いだけの場合は、配置互換になります。
符号付き整数型それぞれに、それに相当する (ただしそれとは異なる) 符号なし整数型があります。これらの相当する型は配置互換になります。
2 つの列挙型は、基礎の型が同一の場合に配置互換になります。
2 つの Plain Old Data (POD) 構造体型は、メンバー数が同一で、順序で対応するメンバーが配置互換である場合に配置互換になります。
2 つの POD 共用体型は、メンバー数が同一で、対応するメンバー (順番は任意) が配置互換である場合に配置互換になります。
参照は、一部の場合に、記憶オブジェクトの動的な型と配置非互換になります。
POD 共用体に、開始シーケンスが共通の POD 構造体が複数含まれていて、その POD 共用体オブジェクトにそれらの POD 構造体のいずれかが含まれている場合は、任意の POD 構造体の共通の開始部分を調べることができます。2 つの POD 構造体が共通の開始シーケンスを共有していて、対応するメンバーの型が配置互換であり、開始メンバーのシーケンスでビットフィールドの幅が同一の場合に、2 つの POD 構造体は開始シーケンスが共通になります。
reinterpret_cast を使用して正しく変換した POD 構造体オブジェクトへのポインタは、その最初のメンバーを示します。そのメンバーがビットフィールドの場合は、そのビットフィールドのあるユニットを示します。
-xalias_level を指定しない場合は、コンパイラでは -xalias_level=any が指定されます。-xalias_level を値なしで指定した場合は、コンパイラでは -xalias_level=compatible が指定されます。
コンパイラは、-xO2 以下の最適化レベルでは、型に基づく別名の解析および最適化を実行しません。
reinterpret_cast またはこれに相当する旧形式のキャストを使用している場合には、解析の前提にプログラムが違反することがあります。また、次の例にあるような共用体の型のパンニングも、解析の前提に違反します。
union bitbucket{ int i; float f; }; int bitsof(float f){ bitbucket var; var.f=3.6; return var.i; } |