__declspec(code_seg)

Microsoft 전용

선언 특성은 code_seg 함수 또는 클래스 멤버 함수에 .obj 대한 개체 코드가 저장되는 파일의 실행 파일 텍스트 세그먼트 이름을 지정합니다.

구문

__declspec(code_seg("segname")) declarator

설명

__declspec(code_seg(...)) 특성을 사용하면 메모리에 개별적으로 페이징 또는 잠글 수 있는 별도의 명명된 세그먼트에 코드를 배치할 수 있습니다. 이 특성을 사용하여 인스턴스화한 템플릿과 컴파일러에서 생성된 코드의 배치를 제어할 수 있습니다.

세그먼트는 메모리에 .obj 단위로 로드되는 파일의 명명된 데이터 블록입니다. 텍스트 세그먼트는 실행 코드를 포함하는 세그먼트입니다. 용어 섹션 은 세그먼트와 상호 교환적으로 사용되는 경우가 많습니다.

declarator가 지정될 때 생성되는 개체 코드는 좁은 문자열 리터럴인 segname에서 지정한 텍스트 세그먼트에 배치됩니다. 선언에서 이름을 사용하려면 섹션 pragma에 이름을 segname 지정할 필요가 없습니다. 기본적으로 지정되지 않은 code_seg 경우 개체 코드는 이름이 지정된 .text세그먼트에 배치됩니다. 특성은 code_seg 기존 #pragma code_seg 지시문을 재정의합니다. code_seg 멤버 함수에 적용된 특성은 바깥쪽 클래스에 적용된 모든 code_seg 특성을 재정의합니다.

엔터티에 특성이 있는 code_seg 경우 동일한 엔터티의 모든 선언 및 정의에는 동일한 code_seg 특성이 있어야 합니다. 기본 클래스에 특성이 있는 code_seg 경우 파생 클래스에는 동일한 특성이 있어야 합니다.

code_seg 네임스페이스 범위 함수 또는 멤버 함수에 특성을 적용하면 해당 함수의 개체 코드가 지정된 텍스트 세그먼트에 배치됩니다. 이 특성이 클래스에 적용되면 컴파일러에서 생성된 특수 멤버 함수를 포함하여 클래스의 모든 멤버 함수와 중첩된 클래스가 지정된 세그먼트에 배치됩니다. 로컬로 정의된 클래스(예: 멤버 함수 본문에 정의된 클래스)는 바깥쪽 범위의 특성을 상속 code_seg 하지 않습니다.

code_seg 특성이 클래스 템플릿 또는 함수 템플릿에 적용되면 템플릿의 모든 암시적 특수화가 지정된 세그먼트에 배치됩니다. 명시적 또는 부분적인 특수화는 기본 템플릿에서 특성을 상속 code_seg 하지 않습니다. 특수화에서 동일하거나 다른 code_seg 특성을 지정할 수 있습니다. code_seg 명시적 템플릿 인스턴스화에는 특성을 적용할 수 없습니다.

기본적으로 특수 멤버 함수와 같은 컴파일러 생성 코드가 세그먼트에 .text 배치됩니다. 지시문은 이 #pragma code_seg 기본값을 재정의하지 않습니다. code_seg 클래스, 클래스 템플릿 또는 함수 템플릿의 특성을 사용하여 컴파일러 생성 코드가 배치되는 위치를 제어합니다.

람다는 묶은 범위에서 특성을 상속 code_seg 합니다. 람다에 대한 세그먼트를 지정하려면 매개 변수 선언 절 뒤와 변경 가능 또는 예외 사양, 후행 반환 형식 사양 및 람다 본문 앞에 특성을 적용 code_seg 합니다. 자세한 내용은 람다 식 구문을 참조 하세요. 이 예제에서는 PagedMem이라는 세그먼트에 람다를 정의합니다.

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

여러 세그먼트에 특정 멤버 함수, 특히 가상 멤버 함수를 배치할 때 주의해야 합니다. 기본 클래스 메서드가 페이징되지 않은 세그먼트에 있을 때 페이징된 세그먼트에 상주하는 파생 클래스에서 가상 함수를 정의한다고 가정해 보겠습니다. 다른 기본 클래스 메서드 또는 사용자 코드에서는 가상 메서드를 호출해도 페이지 오류가 트리거되지 않는다고 가정할 수 있습니다.

예시

이 예제에서는 암시적 템플릿 및 명시적 템플릿 특수화를 사용할 때 특성이 세그먼트 배치를 제어하는 방법을 code_seg 보여 줍니다.

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

Microsoft 전용 종료

참고 항목

__declspec
키워드