__declspec(code_seg)

Microsoft 特定的

宣告屬性會 code_seg 為檔案中的 .obj 可執行文字區段命名,其中儲存函式或類別成員函式的物件代碼。

語法

__declspec(code_seg("segname")) declarator

備註

__declspec(code_seg(...)) 屬性可用於將程式碼分為單獨的具名區段,而且這些區段可個別分頁或鎖定在記憶體中。 您可以使用這個屬性控制具現化的範本及編譯器產生之程式碼的位置。

是檔案中以單位的形式載入記憶體中的 .obj 具名資料區塊。 文字區段 是包含可執行程式碼的區段。 詞彙 區段 通常會與區段互換使用。

定義 declarator 時所產生的目的碼會在 segname (窄字串常值) 所指定的文字區段中。 名稱 segname 不必在區段 pragma 中 指定,才能在宣告中使用。 根據預設,當未 code_seg 指定 時,物件程式碼會放在名為 .text 的區段中。 code_seg屬性會覆寫任何現有的 #pragma code_seg 指示詞。 code_seg套用至成員函式的屬性會覆寫套用至封入類別的任何 code_seg 屬性。

如果實體具有 code_seg 屬性,則相同實體的所有宣告和定義都必須有相同的 code_seg 屬性。 如果基類具有 code_seg 屬性,衍生類別必須具有相同的屬性。

code_seg當屬性套用至命名空間範圍函式或成員函式時,該函式的物件程式碼會放在指定的文字區段中。 當此屬性套用至類別時,類別和巢狀類別的所有成員函式,包括編譯器產生的特殊成員函式,都會放在指定的區段中。 本機定義的類別,例如成員函式主體中定義的類別,不會繼承 code_seg 封入範圍的屬性。

code_seg當屬性套用至類別範本或函式範本時,範本的所有隱含特製化都會放在指定的區段中。 明確或部分特製化不會從主要範本繼承 code_seg 屬性。 您可以在特製化上指定相同或不同的 code_seg 屬性。 code_seg屬性無法套用至明確的範本具現化。

根據預設,編譯器產生的程式碼,例如特殊成員函式會放在 .text 區段中。 指示 #pragma code_seg 詞不會覆寫此預設值。 code_seg使用 類別、類別範本或函式範本上的 屬性來控制編譯器產生的程式碼放置位置。

Lambda 會從其封入範圍繼承 code_seg 屬性。 若要指定 Lambda 的區段,請在參數宣告子句之後,以及在任何可變或例外狀況規格、任何尾端傳回型別規格和 Lambda 主體之前套用 code_seg 屬性。 如需詳細資訊,請參閱 Lambda 運算式語法 。 這個範例會在名為 PagedMem 的區段中定義 Lambda:

auto Sqr = [](int t) __declspec(code_seg("PagedMem")) -> int { return t*t; };

當您將特定成員函式 (尤其是虛擬成員函式) 放在不同的區段時,請特別小心。 假設您在衍生類別中定義虛擬函式,當基類方法位於非分頁區段時,該類別位於分頁區段中。 其他基類方法或使用者程式碼可能會假設叫用虛擬方法不會觸發分頁錯誤。

範例

此範例示範如何使用 code_seg 隱含和明確範本特製化時,屬性控制區段放置:

// code_seg.cpp
// Compile: cl /EHsc /W4 code_seg.cpp

// Base template places object code in Segment_1 segment
template<class T>
class __declspec(code_seg("Segment_1")) Example
{
public:
   virtual void VirtualMemberFunction(T /*arg*/) {}
};

// bool specialization places code in default .text segment
template<>
class Example<bool>
{
public:
   virtual void VirtualMemberFunction(bool /*arg*/) {}
};

// int specialization places code in Segment_2 segment
template<>
class __declspec(code_seg("Segment_2")) Example<int>
{
public:
   virtual void VirtualMemberFunction(int /*arg*/) {}
};

// Compiler warns and ignores __declspec(code_seg("Segment_3"))
// in this explicit specialization
__declspec(code_seg("Segment_3")) Example<short>; // C4071

int main()
{
   // implicit double specialization uses base template's
   // __declspec(code_seg("Segment_1")) to place object code
   Example<double> doubleExample{};
   doubleExample.VirtualMemberFunction(3.14L);

   // bool specialization places object code in default .text segment
   Example<bool> boolExample{};
   boolExample.VirtualMemberFunction(true);

   // int specialization uses __declspec(code_seg("Segment_2"))
   // to place object code
   Example<int> intExample{};
   intExample.VirtualMemberFunction(42);
}

END Microsoft 特定的

另請參閱

__declspec
關鍵字