code_seg (__declspec)code_seg (__declspec)

Microsoft 전용Microsoft Specific

Code_seg 선언 특성은 함수 또는 클래스 멤버 함수의 개체 코드가 저장 될 .obj 파일에서 실행 가능한 텍스트 세그먼트의 이름을 지정할 수 있습니다.The code_seg declaration attribute names an executable text segment in the .obj file in which the object code for the function or class member functions will be stored.

구문Syntax

__declspec(code_seg("segname")) declarator

설명Remarks

__declspec(code_seg(...)) 특성을 사용하면 메모리에 개별적으로 페이징 또는 잠글 수 있는 별도의 명명된 세그먼트에 코드를 배치할 수 있습니다.The __declspec(code_seg(...)) attribute enables the placement of code into separate named segments that can be paged or locked in memory individually. 이 특성을 사용하여 인스턴스화한 템플릿과 컴파일러에서 생성된 코드의 배치를 제어할 수 있습니다.You can use this attribute to control the placement of instantiated templates and compiler-generated code.

세그먼트 는 메모리에 하나의 단위로 로드 되는 .obj 파일의 명명 된 데이터 블록입니다.A segment is a named block of data in an .obj file that is loaded into memory as a unit. 텍스트 세그먼트 는 실행 코드를 포함 하는 세그먼트입니다.A text segment is a segment that contains executable code. 용어 섹션 은 세그먼트와 같은 의미로 사용 되는 경우가 많습니다.The term section is often used interchangeably with segment.

declarator가 지정될 때 생성되는 개체 코드는 좁은 문자열 리터럴인 segname에서 지정한 텍스트 세그먼트에 배치됩니다.Object code that's generated when declarator is defined is put in the text segment specified by segname, which is a narrow-string literal. 이 이름은 segname 선언에서 사용할 수 있기 전에 section pragma에 지정할 필요가 없습니다.The name segname does not have to be specified in a section pragma before it can be used in a declaration. 기본적으로 code_seg가 지정되지 않으면 개체 코드가 .text라는 세그먼트에 배치됩니다.By default, when no code_seg is specified, object code is put in a segment named .text. Code_seg 특성은 모든 기존 #pragma code_seg 지시어를 재정의 합니다.A code_seg attribute overrides any existing #pragma code_seg directive. 멤버 함수에 적용 된 code_seg 특성은 바깥쪽 클래스에 적용 된 모든 code_seg 특성을 재정의 합니다.A code_seg attribute applied to a member function overrides any code_seg attribute applied to the enclosing class.

엔터티에 code_seg 특성이 있는 경우 동일한 엔터티의 모든 선언 및 정의에 동일한 code_seg 특성이 있어야 합니다.If an entity has a code_seg attribute, all declarations and definitions of the same entity must have identical code_seg attributes. 기본 클래스에 code_seg 특성이 있는 경우 파생 클래스에는 동일한 특성이 있어야 합니다.If a base-class has a code_seg attribute, derived classes must have the same attribute.

Code_seg 특성이 네임 스페이스 범위 함수 또는 멤버 함수에 적용 되 면 해당 함수의 개체 코드가 지정 된 텍스트 세그먼트에 배치 됩니다.When a code_seg attribute is applied to a namespace-scope function or a member function, the object code for that function is put in the specified text segment. 이 특성이 클래스에 적용되면 컴파일러 생성 특수 멤버 함수를 포함하는 클래스와 중첩된 클래스의 모든 멤버 함수가 지정된 세그먼트에 배치됩니다.When this attribute is applied to a class, all member functions of the class and nested classes—this includes compiler-generated special member functions—are put in the specified segment. 멤버 함수 본문에 정의 된 클래스와 같이 로컬로 정의 된 클래스는 바깥쪽 범위의 code_seg 특성을 상속 하지 않습니다.Locally defined classes—for example, classes defined in a member function body—do not inherit the code_seg attribute of the enclosing scope.

Code_seg 특성이 템플릿 클래스 또는 템플릿 함수에 적용 되 면 템플릿의 모든 암시적 특수화가 지정 된 세그먼트에 배치 됩니다.When a code_seg attribute is applied to a template class or template function, all implicit specializations of the template are put in the specified segment. 명시적 또는 부분 특수화는 기본 템플릿에서 code_seg 특성을 상속 하지 않습니다.Explicit or partial specializations do not inherit the code_seg attribute from the primary template. 특수화에서 동일 하거나 다른 code_seg 특성을 지정할 수 있습니다.You may specify the same or a different code_seg attribute on the specialization. 명시적 템플릿 인스턴스화에는 code_seg 특성을 적용할 수 없습니다.A code_seg attribute can’t be applied to an explicit template instantiation.

기본적으로 특수 멤버 함수 등 컴파일러에서 생성된 코드는 .text 세그먼트에 배치됩니다.By default, compiler-generated code such as a special member function is put in the .text segment. #pragma code_seg 지시문은 이 기본값을 재정의하지 않습니다.The #pragma code_seg directive does not override this default. 클래스, 클래스 템플릿 또는 함수 템플릿의 code_seg 특성을 사용 하 여 컴파일러에서 생성 된 코드가 배치 되는 위치를 제어 합니다.Use the code_seg attribute on the class, class template, or function template to control where compiler-generated code is put.

람다는 바깥쪽 범위에서 code_seg 특성을 상속 합니다.Lambdas inherit code_seg attributes from their enclosing scope. 람다에 대 한 세그먼트를 지정 하려면 매개 변수 선언 절 뒤에, 변경 가능한 또는 예외 지정, 후행 반환 형식 사양 및 람다 본문 앞에 code_seg 특성을 적용 합니다.To specify a segment for a lambda, apply a code_seg attribute after the parameter-declaration clause and before any mutable or exception specification, any trailing return-type specification, and the lambda body. 자세한 내용은 람다 식 구문을 참조 하세요.For more information, see Lambda Expression Syntax. 이 예제에서는 PagedMem이라는 세그먼트에 람다를 정의합니다.This example defines a lambda in a segment named PagedMem:

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

여러 세그먼트에 특정 멤버 함수, 특히 가상 멤버 함수를 배치할 때 주의해야 합니다.Be careful when you put specific member functions—especially virtual member functions—in different segments. 기본 클래스 메서드가 페이징되지 않은 세그먼트에 상주할 때 페이징된 세그먼트에 상주하는 파생된 클래스에 가상 함수를 정의하는 경우 다른 기본 클래스 메서드 또는 사용자 코드는 가상 메서드를 호출해도 페이지 오류가 트리거되지 않는다고 가정할 수 있습니다.If you define a virtual function in a derived class that resides in a paged segment when the base class method resides in a non-paged segment, other base class methods or user code may assume that invoking the virtual method will not trigger a page fault.

예제Example

이 예제에서는 암시적 및 명시적 템플릿 특수화를 사용할 때 code_seg 특성이 세그먼트 배치를 제어 하는 방법을 보여 줍니다.This example shows how a code_seg attribute controls segment placement when implicit and explicit template specialization is used:

// 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 전용 종료END Microsoft Specific

참조See also

__declspec__declspec
키워드Keywords