__declspec(code_seg)

Sezione specifica Microsoft

L'attributo code_seg di dichiarazione assegna un nome a un segmento di testo eseguibile nel .obj file in cui è archiviato il codice oggetto per le funzioni membro della funzione o della classe.

Sintassi

__declspec(code_seg("segname")) declarator

Osservazioni:

L'attributo __declspec(code_seg(...)) consente il posizionamento del codice in segmenti denominati separati di cui è possibile eseguire singolarmente il paging o il blocco in memoria. È possibile usare questo attributo per controllare il posizionamento dei modelli di cui sono state create istanze e del codice generato dal compilatore.

Un segmento è un blocco denominato di dati in un .obj file caricato in memoria come unità. Un segmento di testo è un segmento che contiene codice eseguibile. La sezione del termine viene spesso usata in modo intercambiabile con segmento.

Il codice oggetto generato quando viene definito declarator viene inserito nel segmento di testo specificato da segname, ovvero un valore letterale stringa "narrow". Il nome segname non deve essere specificato in un pragma di sezione prima che possa essere usato in una dichiarazione. Per impostazione predefinita, quando non viene specificato alcun code_seg oggetto, il codice oggetto viene inserito in un segmento denominato .text. Un code_seg attributo esegue l'override di qualsiasi direttiva #pragma code_seg esistente. Un code_seg attributo applicato a una funzione membro esegue l'override di qualsiasi code_seg attributo applicato alla classe di inclusione.

Se un'entità ha un code_seg attributo, tutte le dichiarazioni e le definizioni della stessa entità devono avere attributi identici code_seg . Se una classe base ha un code_seg attributo, le classi derivate devono avere lo stesso attributo.

Quando un code_seg attributo viene applicato a una funzione dell'ambito dello spazio dei nomi o a una funzione membro, il codice oggetto per tale funzione viene inserito nel segmento di testo specificato. Quando questo attributo viene applicato a una classe, tutte le funzioni membro della classe e delle classi annidate, incluse le funzioni membro speciali generate dal compilatore, vengono inserite nel segmento specificato. Le classi definite localmente, ad esempio le classi definite in un corpo della funzione membro, non ereditano l'attributo code_seg dell'ambito di inclusione.

Quando un code_seg attributo viene applicato a un modello di classe o a un modello di funzione, tutte le specializzazioni implicite del modello vengono inserite nel segmento specificato. Le specializzazioni esplicite o parziali non ereditano l'attributo code_seg dal modello primario. È possibile specificare lo stesso attributo o un attributo diverso code_seg nella specializzazione. Non è possibile applicare un code_seg attributo a un'istanza esplicita del modello.

Per impostazione predefinita, il codice generato dal compilatore, ad esempio una funzione membro speciale, viene inserito nel .text segmento. La direttiva non esegue l'override #pragma code_seg di questa impostazione predefinita. Usare l'attributo nella classe, nel code_seg modello di classe o nel modello di funzione per controllare dove viene inserito il codice generato dal compilatore.

Le espressioni lambda ereditano code_seg gli attributi dal relativo ambito di inclusione. Per specificare un segmento per un'espressione lambda, applicare un code_seg attributo dopo la clausola parameter-declaration e prima di qualsiasi specifica modificabile o eccezione, qualsiasi specifica di tipo restituito finale e il corpo lambda. Per altre informazioni, vedere Sintassi delle espressioni lambda. In questo esempio viene definita un'espressione lambda in un segmento denominato PagedMem:

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

Prestare attenzione nell'inserire funzioni membro specifiche, in particolare funzioni membro virtuali, in segmenti diversi. Si supponga di definire una funzione virtuale in una classe derivata che risiede in un segmento di paging quando il metodo della classe base si trova in un segmento non di paging. Altri metodi della classe base o codice utente possono presupporre che richiamare il metodo virtuale non attiverà un errore di pagina.

Esempio

Questo esempio mostra come viene usato un code_seg attributo che controlla il posizionamento dei segmenti quando viene usata la specializzazione implicita ed esplicita del modello:

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

Fine sezione specifica Microsoft

Vedi anche

__declspec
Parole chiave