__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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per