共用方式為


__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);
}

結束 Microsoft 特定內容

另請參閱

__declspec
關鍵字