code_seg
関数が格納される .obj ファイル内のテキスト セグメントを指定します。
#pragma code_seg( [ [ { push | pop }, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] )
解説
code_seg プラグマ ディレクティブは、インスタンス化されたテンプレート用に生成されたオブジェクト コードや、コンパイラによって暗黙的に生成されたコード (特殊なメンバー関数など) の格納場所を制御するものではありません。 代わりに、__declspec(code_seg(...)) 属性を使用することをお勧めします。すべてのオブジェクト コードの格納場所も、 コンパイラによって生成されたコードの格納場所も制御できるためです。
.obj ファイル内のセグメントは、メモリへの読み込み単位となる名前付きのデータ ブロックです。 テキスト セグメントは、実行可能なコードが格納されるセグメントです。 この記事では、セグメントとセクションという用語は同義です。
code_seg プラグマ ディレクティブは、翻訳単位の後続のすべてのオブジェクト コードを segment-name というテキスト セグメントに格納するように、コンパイラに指示します。 既定では、.obj ファイル内の関数に使用されるテキスト セグメントには .text という名前が付けられます。
code_seg プラグマ ディレクティブは、パラメーターが指定されない場合、後続のオブジェクト コードのテキスト セグメント名を .text にリセットします。
Push (省略可能)
レコードを内部コンパイラ スタックに格納します。 push には identifier と segment-name を指定できます。pop (省略可能)
内部コンパイラ スタックの最上部からレコードを削除します。identifier (省略可能)
push と共に使用した場合、内部コンパイラ スタックのレコードに名前を割り当てます。 pop と共に使用した場合、identifier が削除されるまでレコードを内部スタックからポップします。identifier が内部スタックにない場合は何もポップされません。identifier を使用して、複数のレコードを 1 つの pop コマンドでポップできます。
"segment-name" (省略可能)
引数の名前。 pop と共に使用した場合、スタックがポップされ、segment-name がアクティブなテキスト セグメント名になります。"segment-class" (省略可能)
無視されますが、C++ 2.0 より前のバージョンとの互換性を保つために残されています。
DUMPBIN.EXE アプリケーションを使用して .obj ファイルを表示できます。 サポートされている各ターゲット アーキテクチャの DUMPBIN のバージョンは Visual Studio に付属しています。
使用例
この例では、code_seg プラグマ ディレクティブを使用して、オブジェクト コードの格納場所を制御する方法を示しています。
// pragma_directive_code_seg.cpp
void func1() { // stored in .text
}
#pragma code_seg(".my_data1")
void func2() { // stored in my_data1
}
#pragma code_seg(push, r1, ".my_data2")
void func3() { // stored in my_data2
}
#pragma code_seg(pop, r1) // stored in my_data1
void func4() {
}
int main() {
}
セクションを作成する場合に使用しない名前のリストについては、「/SECTION」を参照してください。
初期化されたデータのセクション (data_seg)、初期化されていないデータのセクション (bss_seg)、および const 変数のセクション (const_seg) を指定することもできます。