code_seg (__declspec)
Specyficzne dla firmy Microsoft
code_seg Deklaracji atrybutu nazwy segment wykonywalnego tekst w pliku .obj, w którym będzie przechowywany kod obiektu dla funkcji lub klasy funkcji elementów członkowskich.
__declspec(code_seg("segname")) declarator
Uwagi
__declspec(code_seg(...)) Atrybut umożliwia umieszczenie kodu w oddzielnym o nazwie segmenty, które można stronicowanej lub pojedynczo zablokowana w pamięci.Możesz używać tego atrybutu, aby kontrolować rozmieszczenie wystąpień szablonów i kodu generowanego przez kompilator.
Element segment jest nazwanego bloku danych w pliku .obj, który jest ładowany do pamięci jako jednostki.Element tekst segmentu jest segment, który zawiera kod wykonywalny.Określenie sekcji jest używany zamiennie z segmentem.
Kod, który wygenerował, gdy obiekt declarator jest zdefiniowana jest umieszczana w segmencie tekstu określonego przez segname, co jest literałem ciągu wąskie.Nazwa segname nie musi być określone w sekcji dyrektywę pragma, zanim będzie można użyć w deklaracji.Domyślnie, gdy nie code_seg określono kod obiektu jest umieszczany w segment o nazwie Text.Element code_seg atrybutu zastąpienia żadnych istniejących #pragma code_seg dyrektywy.Element code_seg zastosowania do funkcji elementu członkowskiego zastępuje dowolne code_seg atrybutu stosowane do klasy otaczającego.
Jeśli ma jednostki code_seg atrybutu, wszystkie deklaracje i definicje tej samej jednostki musi mieć takie same code_seg atrybutów.Jeśli ma klasy podstawowej code_seg atrybutu opracowane klasy musi mieć taki sam atrybut.
Gdy code_seg jest stosowany do funkcji scope nazw lub elementu członkowskiego, kod obiektu dla tej funkcji jest umieszczana w segmencie określony tekst.Gdy ten atrybut jest stosowany do klasy, wszystkie funkcje elementów członkowskich klasy i klas zagnieżdżonych — dotyczy to również generowanych przez kompilator specjalnych funkcji elementów członkowskich — są umieszczane w określonym segmencie.Lokalnie zdefiniowane klasy — na przykład klas zdefiniowanych w treści funkcji elementu członkowskiego — nie dziedziczą code_seg atrybutu otaczającego zakresu.
Gdy code_seg jest stosowany do szablonu klasy lub funkcji szablonu, wszystkie specjalizacji niejawne szablonu są umieszczane w określony segment.Specjalizacji jawne lub jego część nie dziedziczą code_seg atrybutu z szablonu podstawowego.Można określić takie same lub inne code_seg atrybut specjalizacji.Element code_seg atrybutu nie można zastosować do wystąpienia szablonu jawnego.
Domyślnie, kod generowany przez kompilator, taki jak funkcja specjalna elementu członkowskiego, jest umieszczany w segmencie .text.#pragma code_seg Dyrektywy nie zastępuje to ustawienie domyślne.Użyj code_seg atrybut klasy, szablon klasy lub szablonu funkcji do kontroli, gdzie jest umieszczany kompilatora wygenerowany kod.
Dziedzicz lambdas code_seg atrybuty z ich otaczającego zakresu.Aby określić segment dla lambda, zastosuj code_seg atrybutu po klauzuli Deklaracja parametru i przed wywołaniem dowolnych modyfikowalna lub specyfikacji wyjątek, wszelkie końcową specyfikacji typu powrotu i treść lambda.Aby uzyskać więcej informacji, zobacz Składnia wyrażenia lambda.Ten przykład definiuje lambdę w segmencie o nazwie PagedMem:
auto Sqr = [](int t) __declspec(code_seg("PagedMem")) -> int { return t*t; };
Należy zachować ostrożność przy umieszczaniu określonych funkcji elementów członkowskich — zwłaszcza wirtualnych funkcji elementów członkowskich — w różnych segmentach.W przypadku definiowania funkcji wirtualnej w klasie pochodnej, która znajduje się w segmencie stronicowanym, gdy metoda klasy podstawowej znajduje się w segmencie niestronicowanym, inne metody klasy podstawowej lub kod użytkownika mogą przyjąć, że wywołanie wirtualnej metody nie wywoła błędu stronicowania.
Przykład
W tym przykładzie przedstawiono sposób code_seg formanty atrybut segmentu umieszczania, jeśli niejawne i specjalizacji jawnego szablonu jest używany:
// 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);
}
KONIEC Specyficzne dla firmy Microsoft