オブジェクトへの優先順位の割り当て

単一ライブラリー内のオブジェクトおよびファイルには、優先順位番号を割り当てることができます。オブジェクトは、その優先順位に従って実行時に初期化されます。ただし、モジュールのロード方法が異なり、オブジェクトが異なるプラットフォーム上で初期化されるため、優先順位を割り当てられるレベルは、次のように、プラットフォームによって違います。

AIX Linux ファイル全体に優先順位を設定する
この方法を使用するには、コンパイル時に -qpriority コンパイラー・オプションを指定します。デフォルトでは、単一ファイル内のオブジェクトはすべて同じ優先順位に割り当てられ、宣言された順序で初期化され、宣言とは逆の順序で終了します。

AIX Linux Mac OS X ファイル内のオブジェクトに優先順位を設定する
この方法を使用するには、ソース・ファイルに #pragma priority ディレクティブを組み込みます。個々の #pragma priority ディレクティブは、別の pragma ディレクティブが指定されるまで、そのあとに続くすべてのオブジェクトに優先順位を設定します。ファイル内では、最初の #pragma priority ディレクティブの優先順位番号は、 -qpriority オプションを使用する場合は、そこで指定される番号より大きくしなければなりません。また、それ以後の #pragma priority ディレクティブの番号は、昇順にする必要があります。単一ファイル のオブジェクトの相対優先順位は、そのオブジェクトの宣言順序のままですが、pragma ディレクティブは、オブジェクトが複数ファイル で初期化される場合の順序に影響を与えます。オブジェクトは、その優先順位に従って初期化され、その逆の順序で終了します。

Linux Mac OS X 個々のオブジェクト別に優先順位を設定する
この方法を使用するには、ソース・ファイルで、 init_priority 変数属性を使用します。 init_priority 属性は、 #pragma priority ディレクティブより優先され、任意の宣言順序でオブジェクトに適用できます。 Linux では、オブジェクトは優先順位に従って初期化され、いくつかのコンパイル単位にわたって、その逆の順序で終了します。 Mac OS X では、オブジェクトは優先順位に従って初期化され、 1 つのコンパイル単位 でのみ、その逆の順序で終了します。

AIX AIX に限って、それ以外に、 -qmkshrobj コンパイラー・オプションの優先順位サブオプションを使用して、共用ライブラリー全体の優先順位を設定することもできます。AIX では、ロードと初期化は別々のプロセスとして発生するので、ファイル (またはファイル内のオブジェクト) に割り当てられる優先順位番号は、ライブラリーに割り当てられる優先順位番号とはまったく無関係であり、シーケンスに従う必要はありません。

優先順位番号の使用

AIX 優先順位番号の範囲は、 -2147483643 から 2147483647 までです。ただし、-2147483648 〜 -2147482624 までの番号はシステム用になっています。指定できる最小の優先順位番号は -2147482623 で、この番号のものが最初に初期化されます。最大の優先順位番号は 2147483647 で、この番号のものが最後に初期化されます。優先順位が指定されていない場合、デフォルトの優先順位は 0 (ゼロ) になります。

Linux Mac OS X 優先順位番号の範囲は 101 から 65535 までです。指定できる最小の優先順位番号は 101 で、この番号のものが最初に初期化されます。最大の優先順位番号は 65535 であり、この番号のものが最後に初期化されます。優先順位が指定されていない場合、デフォルトの優先順位は 65535 になります。

以下の例は、単一ファイル内のオブジェクト、および 2 つのファイル間のオブジェクトの優先順位を指定する方法を示したものです。 ライブラリー間のオブジェクト初期化の順序には、 Linux プラットフォームでのオブジェクトの初期化順序に関する詳細情報が記載されています。

ファイル内のオブジェクトの初期化の例

次の例は、ソース・ファイル内のいくつかのオブジェクトの優先順位の指定方法を示しています。

...
#pragma priority(2000) //Following objects constructed with priority 2000
...
 
static Base a ;
 
House b ;
...
#pragma priority(3000) //Following objects constructed with priority 3000
...
 
Barn c ;
...
#pragma priority(2500) // Error - priority number must be larger
// than preceding number (3000)
...
#pragma priority(4000) //Following objects constructed with priority 4000
...
 
Garage d ;
...

複数ファイル間のオブジェクト初期化の例

次の例は、farm.Czoo.C の 2 つのファイル内のオブジェクトの初期化の順序を記述したものです。 2 つのファイルは、ともに #pragma priority ディレクティブを使用し、 -qpriority オプションでコンパイルされています。

farm.C -qpriority=2000 zoo.C -qpriority=2000
#pragma priority(3000)
...
Dog a ;
Dog b ;
...
#pragma priority(6000)
...
Cat c ;
Cow d ;
...
#pragma priority(7000)
Mouse e ;
...
...
Lion k ;
#pragma priority(4000)
Bear m ;
...
#pragma priority(5000)
...
Zebra n ;
Snake s ;
...
#pragma priority(8000)
Frog f ;
...

実行時には、これらのファイル内のオブジェクトは、次の順序で初期化されます。

シーケンス オブジェクト 優先順位の値 コメント
1 Lion k 2000 ファイル zoo.o の優先順位番号 (2000) を使用 (最初に初期化)。
2 Dog a 3000 pragma の優先順位 (3000) を使用。
3 Dog b 3000 Dog a と同じ。
4 Bear m 4000 pragma で指定された、次の優先順位番号 (4000)。
5 Zebra n 5000 pragma で指定された、次の優先順位番号 (5000)。
6 Snake s 5000 同じ優先順位で続く。
7 Cat c 6000 次の優先順位番号。
8 Cow d 6000 同じ優先順位で続く。
9 Mouse e 7000 次の優先順位番号。
10 Frog f 8000 次の優先順位番号 (最後に初期化)。

IBM Copyright 2003