__declspec(code_seg)

Microsoft-spezifisch

Das code_seg Deklarationsattribut benennt ein ausführbares Textsegment in der .obj Datei, in dem der Objektcode für die Funktionen der Funktion oder der Klassenmememm gespeichert ist.

Syntax

__declspec(code_seg("segname")) declarator

Hinweise

Das __declspec(code_seg(...))-Attribut aktiviert die Platzierung von Code in getrennt benannte Segmente, die einzeln ausgelagert oder im Speicher gesperrt werden können. Sie können dieses Attribut verwenden, um die Platzierung instanziierter Vorlagen und von durch den Compiler generiertem Code zu steuern.

Ein Segment ist ein benannter Datenblock in einer .obj Datei, die als Einheit in den Speicher geladen wird. Ein Textsegment ist ein Segment , das ausführbaren Code enthält. Der Begriffsabschnitt wird häufig austauschbar mit Segmenten verwendet.

Objektcode, der generiert wird, wenn declarator definiert wird, wird in das durch segname angegebene Textsegment platziert, das ein Literal mit schmaler Zeichenfolge ist. Der Name segname muss nicht in einem Abschnitts pragma angegeben werden, bevor er in einer Deklaration verwendet werden kann. Wenn kein code_seg Objekt angegeben wird, wird der Objektcode standardmäßig in einem Segment mit dem Namen platziert .text. Ein code_seg Attribut setzt alle vorhandenen #pragma code_seg-Direktiven außer Kraft. Ein code_seg Attribut, das auf eine Memberfunktion angewendet wird, setzt jedes code_seg Attribut außer Kraft, das auf die eingeschlossene Klasse angewendet wird.

Wenn eine Entität über ein code_seg Attribut verfügt, müssen alle Deklarationen und Definitionen derselben Entität identische code_seg Attribute aufweisen. Wenn eine Basisklasse über ein code_seg Attribut verfügt, müssen abgeleitete Klassen dasselbe Attribut aufweisen.

Wenn ein code_seg Attribut auf eine Namespacebereichsfunktion oder eine Memberfunktion angewendet wird, wird der Objektcode für diese Funktion im angegebenen Textsegment platziert. Wenn dieses Attribut auf eine Klasse angewendet wird, werden alle Memberfunktionen der Klasse und geschachtelter Klassen , einschließlich von Compiler generierten speziellen Memberfunktionen, im angegebenen Segment platziert. Lokal definierte Klassen , z. B. Klassen, die in einem Memberfunktionstext definiert sind, erben nicht das code_seg Attribut des eingeschlossenen Bereichs.

Wenn ein code_seg Attribut auf eine Klassenvorlage oder Funktionsvorlage angewendet wird, werden alle impliziten Spezialisierungen der Vorlage in das angegebene Segment eingefügt. Explizite oder teilweise Spezialisierungen erben das code_seg Attribut nicht von der primären Vorlage. Sie können dasselbe oder ein anderes code_seg Attribut für die Spezialisierung angeben. Ein code_seg Attribut kann nicht auf eine explizite Vorlageninstanziierung angewendet werden.

Standardmäßig wird vom Compiler generierter Code, z. B. eine spezielle Memberfunktion, im .text Segment platziert. Die #pragma code_seg Direktive überschreibt diese Standardeinstellung nicht. Verwenden Sie das code_seg Attribut für die Klassen-, Klassenvorlage oder Funktionsvorlage, um zu steuern, wo compilergenerierten Code eingefügt wird.

Lambdas erben code_seg Attribute vom eingeschlossenen Bereich. Um ein Segment für eine Lambda-Funktion anzugeben, wenden Sie ein code_seg Attribut nach der Parameterdeklarationsklausel und vor jeder änderbaren oder Ausnahmespezifikation, einer nachfolgenden Rückgabetypspezifikation und dem Lambda-Textkörper an. Weitere Informationen finden Sie unter Lambda-Ausdruckssyntax. In diesem Beispiel wird ein Lambda in einem Segment mit dem Namen PagedMem definiert:

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

Passen Sie auf, wenn Sie spezifische Memberfunktionen – insbesondere virtuelle Memberfunktionen – in unterschiedliche Segmente platzieren. Angenommen, Sie definieren eine virtuelle Funktion in einer abgeleiteten Klasse, die sich in einem seitenseitigen Segment befindet, wenn sich die Basisklassenmethode in einem nicht seitenseitigen Segment befindet. Andere Basisklassenmethoden oder Benutzercode gehen möglicherweise davon aus, dass das Aufrufen der virtuellen Methode keinen Seitenfehler auslöst.

Beispiel

In diesem Beispiel wird gezeigt, wie eine code_seg Attribut die Segmentplatzierung steuert, wenn implizite und explizite Vorlagenspezialisierung verwendet wird:

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

Ende Microsoft-spezifisch

Siehe auch

__declspec
Schlüsselwörter