code_seg (__declspec)
Specifické pro Microsoft
code_seg Atribut deklarace názvy segment spustitelný text v souboru .obj, ve kterém bude uložen objektový kód pro funkci nebo členské funkce třídy.
__declspec(code_seg("segname")) declarator
Poznámky
__declspec(code_seg(...)) Atribut umožňuje umístění kód do samostatného s názvem segmentů, které mohou být stránkovaného fondu nebo v paměti uzamčena jednotlivě.Tento atribut umožňuje řídit umístění instancí šablon a kódu generovanému kompilátorem.
Objekt segment je pojmenovaný blok dat v souboru .obj, který je načten do paměti jako jeden celek.Objekt text segmentu je segment, který obsahuje spustitelný kód.Termín části se často používá vzájemně zaměňovat segmentu.
Objekt kódu, která vygenerovala při declarator je definován je umístěn v segmentu text zadaný pomocí segname, což je úzký řetězcový literál.Název segname není třeba zadat v části pragma předtím, než lze v deklaraci.Ve výchozím nastavení, pokud ne code_seg je zadán kód objekt je umístěn v segmentu s názvem text.Objekt code_seg atribut přepíše jakékoli existující #pragma code_seg direktivu.Objekt code_seg atribut použít na funkci člena přepíše jakékoli code_seg atribut použitý ohraničující třídy.
Pokud má entita code_seg atribut, všechny deklarace a definice stejnou entitu musí mít identické code_seg atributy.Pokud má základní třídy code_seg atributu, odvozené třídy musí mít stejný atribut.
Když code_seg funkce obor názvů nebo člena funkci je použit atribut, kód objektu pro tuto funkci je umístěn v segmentu zadaný text.Pokud je tento atribut aplikován na třídu, všechny členské funkce třídy a vnořené třídy – včetně kompilátorem generované zvláštní členské funkce – jsou umístěny v zadaném segmentu.Místně definované třídy – například tříd definovaných v těle funkce na člena – nedědí code_seg atribut nadřazených oboru.
Když code_seg atributu se použije šablona třídu nebo funkce šablony, všechny implicitní odborností šablony jsou umístěny do zadaného segmentu.Explicitní nebo jeho část odborností nedědí code_seg atribut z primární šablony.Můžete zadat stejná nebo na jiný code_seg atribut dosažené.Objekt code_seg atribut nelze použít pro instanci explicitní šablony.
Ve výchozím nastavení je kód generovaný kompilátorem, jako speciální členská funkce, umístěn to segmentu .text.#pragma code_seg Směrnice nemůže přepsat toto výchozí nastavení.Použití code_seg atribut v dané třídě šablonu třídy nebo funkce šablony ke kontrole, kde kompilátoru generovaný kód je umístěn.
Dědit lambda výrazy code_seg atributy z jejich nadřazených oboru.Chcete-li určit segmentu pro lambda, použijte code_seg atribut po klauzuli deklarace parametru a před jakýmikoli měnitelný nebo specifikace výjimky, žádné koncové specifikace return-type a datové části lambda.Další informace naleznete v tématu Syntaxe výrazu lambda.Tento příklad definuje výraz lambda v segmentu s názvem PagedMem:
auto Sqr = [](int t) __declspec(code_seg("PagedMem")) -> int { return t*t; };
Buďte opatrní při uvádění určitých členských funkcí – zejména virtuální členské funkce – do různých segmentů.Pokud definujete virtuální funkci v odvozené třídě, která se nachází ve stránkovaném segmentu, když je metoda základní třídy umístěna v nestránkovaném segmentu, jiné metody základní třídy nebo uživatelský kód mohou předpokládat, že vyvoláním virtuální metody nespustí chybu stránkování.
Příklad
Tento příklad ukazuje, jak code_seg ovládací prvky atribut segmentu umístění při implicitní a explicitní šablony dosažené se používají:
// 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 Specifické pro Microsoft