JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: C ユーザーガイド     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  C コンパイラの紹介

2.  C コンパイラ実装に固有の情報

3.  C コードの並列化

4.  lint ソースコード検査プログラム

5.  型に基づく別名解析

5.1 型に基づく解析の概要

5.2 微調整におけるプラグマの使用

5.2.1 #pragma alias_level level (list)

5.2.1.1 #pragma alias (type, type [, type]...)

5.2.1.2 #pragma alias (pointer, pointer [, pointer] ...)

5.2.1.3 #pragma may_point_to (pointer, variable [, variable] ...)

5.2.1.4 #pragma noalias (type, type [, type]...)

5.2.1.5 #pragma noalias (pointer, pointer [, pointer] ...)

5.2.1.6 #pragma may_not_point_to (pointer, variable [, variable] ...)

5.2.1.7 #pragma ivdep

5.3 lint によるチェック

5.3.1 構造体ポインタへのスカラーポインタのキャスト

5.3.2 構造体ポインタへの void ポインタのキャスト

5.3.3 構造体ポインタへの構造体フィールドのキャスト

5.3.4 明示的な別名設定が必要

5.4 メモリー参照の制限の例

5.4.1 例: 別名のレベル

5.4.2 例: さまざまな別名レベルでのコンパイル

5.4.3 例: 内部ポインタ

5.4.4 例: 構造体のフィールド

5.4.5 例: 共用体

5.4.6 例: 構造体の構造体

5.4.7 例: プラグマの使用

6.  ISO C への移行

7.  64 ビット環境に対応するアプリケーションへの変換

8.  cscope: 対話的な C プログラムの検査

A.  機能別コンパイラオプション

B.  C コンパイラオプションリファレンス

C.  ISO/IEC C 99 の処理系定義の動作

D.  C99 の機能

E.  ISO/IEC C90 の処理系定義の動作

F.  ISO C データ表現

G.  パフォーマンスチューニング

H.  Oracle Solaris Studio C: K&R C と ISO C の違い

索引

5.2 微調整におけるプラグマの使用

より詳細なほうが型に基づいた解析に有利な場合は、この節で説明するプラグマを使用すると、適用されている別名レベルを無効にし、個々の型またはポインタ変数間の別名関係を変換単位で指定できます。これらのプラグマは、いくつかの特定のポインタ変数がいずれかの使用可能なレベルで許可されていない不規則な方法で使用されていても、変換単位でのポインタの使用がいずれかの使用可能な別名レベルと一貫していているときに、最大の利益を提供します。


注 - プラグマより先に命名済みの型または変数を宣言しない場合、警告メッセージが発行され、プラグマが無視されます。プラグマの意味の適用される最初のメモリー参照のあとにプラグマを配置した場合、プログラムは未定義の結果を生成します。


プラグマの定義では、次の表に示す用語を使用します。

用語
意味
level
「B.2.76 -xalias_level[= l]」に一覧表示されている任意の別名レベル
type
次のいずれかです。
  • charshortintlonglong longfloatdoublelong double

  • void。すべてのポインタの型を示します。

  • typedef nametypedef 宣言で定義される型の名前。

  • struct namestruct tag 名が後続するキーワード struct のことです。

  • unionunion tag 名が後続するキーワード union のことです。

pointer_name
翻訳単位におけるポインタ型の変数の名前

5.2.1 #pragma alias_level level (list)

level は、次の別名レベルのいずれかと置き換えます。anybasicweaklayoutstrictstd、または stronglist は、単一の型またはポインタで置き換えることも、型またはポインタのコンマ区切りリストで置き換えることもできます。たとえば、#pragma alias_level を次のように発行できます。

このプラグマは、指定の別名レベルがリストの型に対応する翻訳単位のすべてのメモリー参照、または命名済みのポインタ変数が参照解除されている翻訳単位のすべての参照解除に適用されることを指定します。

特定の参照解除に対し複数の別名レベルを指定した場合、ポインタ名によって適用されたレベルがほかのすべてのレベルに優先します。型名によって適用されたレベルは、オプションによって適用されたレベルに優先します。次の例では、#pragma alias_levelany より上位に設定してプログラムをコンパイルした場合に、std レベルが p に適用されます。

typedef int * int_ptr;
int_ptr p;
#pragma alias_level strong (int_ptr)
#pragma alias_level std (p)

5.2.1.1 #pragma alias (type, type [, type]…)

このプラグマは、リストされているすべての型が相互に別名設定することを指定します。次の例では、コンパイラは、間接アクセス *pt が間接アクセス *pf を別名設定することを仮定します。

#pragma alias (int, float)
int *pt;
float *pf;

5.2.1.2 #pragma alias (pointer, pointer [, pointer] …)

このプラグマは、命名済みのポインタ変数の参照解除の地点で、参照解除されているポインタ値がそのほかの命名済みポインタ変数と同じオブジェクトをポイントできることを指定します。ただし、ポインタは、命名済みの変数に含まれるオブジェクトだけに制限されず、リストに含まれていないオブジェクトをポイントできます。このプラグマは、適用される別名レベルの別名設定仮定を無効にします。次の例では、プラグマに続く間接アクセス pq が (2 つのポインタの型に関係なく) 別名設定すると見なされます。

#pragma alias(p, q)

5.2.1.3 #pragma may_point_to (pointer, variable [, variable] …)

このプラグマは、命名済みのポインタ変数の参照解除の地点で、参照解除されているポインタ値が命名済みの変数に含まれているオブジェクトにポイントできることを指定します。ただし、ポインタは、命名済みの変数に含まれるオブジェクトだけに制限されず、リストに含まれていないオブジェクトをポイントできます。このプラグマは、適用される別名レベルの別名設定仮定を無効にします。次の例では、コンパイラは、間接アクセス *p が直接アクセス ab、および c を別名設定すると仮定します。

#pragma alias may_point_to(p, a, b, c)

5.2.1.4 #pragma noalias (type, type [, type]…)

このプラグマは、リストされている型が相互に別名設定しないことを指定します。次の例では、コンパイラは、間接アクセス *p が間接アクセス *ps を別名設定しないと仮定します。

struct S {
   float f;
   ...} *ps;

#pragma noalias(int, struct S)
int *p;

5.2.1.5 #pragma noalias (pointer, pointer [, pointer] …)

このプラグマは、命名済みのポインタ変数の参照解除の地点で、参照解除されているポインタがそのほかの命名済みポインタ変数と同じオブジェクトをポイントしないことを指定します。このプラグマは、適用されているそのほかすべての別名レベルを無効にします。次の例では、コンパイラは、間接アクセス *p が間接アクセス *q を (2 つのポインタの型に関係なく) 別名設定しないことを仮定します。

#pragma noalias(p, q)

5.2.1.6 #pragma may_not_point_to (pointer, variable [, variable] …)

このプラグマは、命名済みのポインタ変数の参照解除の地点で、参照解除されているポインタ値が命名済みの変数に含まれているオブジェクトをポイントしないことを指定します。このプラグマは、適用されているそのほかすべての別名レベルを無効にします。次の例では、コンパイラは、間接アクセス *p が直接アクセス ab、または c を別名設定しないことを仮定します。

#pragma may_not_point_to(p, a, b, c)

5.2.1.7 #pragma ivdep

ivdep プラグマは、最適化の目的でループ内で検出された、配列参照へのループがもたらす依存関係の一部またはすべてを無視するようにコンパイラに指示します。これにより、指定しない場合には実行不可能なマイクロベクトル化、分散、ソフトウェアパイプライン化などの各種ループ最適化を、コンパイラが実行できるようになります。これは、依存関係が重要ではない、または依存関係が実際に発生しないことをユーザーが把握している場合に使用されます。

#pragma ivdep 指令の解釈は、—xivdep オプションの値に応じて異なります。