Udostępnij za pośrednictwem


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

Zobacz też

Informacje

__declspec

Słowa kluczowe języka C++