다음을 통해 공유


맞춤 (C++)

Microsoft 전용

사용 __declspec(align(#)) 정확 하 게 사용자 정의 데이터 (예: 정적 할당 하거나 함수에서 자동으로 데이터)의 맞춤을 제어 합니다.

맞춤에 대 한 자세한 내용은 참조 하십시오. Windows 데이터 정렬에서 IPF x 86, x 64.

__declspec( align( # ) ) declarator

설명

최신 프로세서 지침을 사용 하는 응용 프로그램을 작성할 새 제약 조건과 문제 몇 가지를 소개 합니다.특히 새로운 많은 명령을 데이터 16 바이트 경계에 정렬 되어야 합니다 필요 합니다.또한, 특정 프로세서의 캐시 라인 크기를 자주 사용 하는 데이터를 정렬 하 여 캐시 성능을 향상 시킬 합니다.예를 들어, 32 바이트 보다 작으면 크기가 다른 구조체를 정의 하는 경우 해당 구조 형식의 개체를 효율적으로 캐시 되지 않도록 하려면 32 바이트에 맞춘 좋습니다.

# 맞춤 값입니다.유효한 항목 1 8192 (바이트)로, 2, 4, 8, 16, 32 또는 64와 같은 2의 정수 제곱입니다.declarator데이터 정렬에 따라 선언 하는 것입니다.

참조 하십시오 __alignof 형식의 값을 반환 하는 방법에 대 한 내용은 size_t 맞춤 요구 사항 형식입니다.및 >__unaligned 64 비트 프로세서를 대상으로 맞추어지지 않은 포인터를 선언 하는 방법에 대 한.

사용할 수 있습니다 __declspec(align(#)) 를 정의할는 struct, union, 또는 class, 또는 변수를 선언 합니다.

하지 않고 __declspec(align(#)), Visual C++ 데이터 4 바이트 경계에는 예를 들어 4 바이트 정수 및 8 바이트 double 8 바이트 경계에 있는 데이터의 크기에 따라 자연 경계에 맞춰 정렬 합니다.클래스 또는 구조체의 기본 정렬 및 포장의 현재 설정을 최소한 내에서 클래스 또는 구조체의 데이터 정렬 (# pragma에서 pack 또는 /Zp 컴파일러 옵션).

함수 매개 변수에 대 한 맞춤을 지정할 수 없습니다.

예를 들면 다음과 같습니다.

__declspec(align(32)) struct Str1{
   int a, b, c, d, e;
};

이 형식의 인스턴스를 모두 32 바이트 경계에서 시작 해야 함을 의미 32 바이트 맞춤 특성을 이제 있습니다.추가 구조 형식 구성원으로이 형식으로 선언 된이 유형을 맞춤 특성이 유지, 하나를 구조 Str1 맞춤 특성은 적어도 32 있는 요소 라고 합니다.

즉, 다음과 같이 수행합니다.

  • 재정의 하지 않는 한 __declspec(align(#)), 스칼라 구조체 멤버의 최소 크기와 현재 압축 되었습니다.

  • 재정의 하지 않는 한 __declspec(align(#)), 구조체의 최대의 그 구성원의 개별 정렬 되었습니다.

  • 구조체 멤버는 해당 맞춤 오프셋은 이전 멤버의 끝 보다 크거나 작은 여러 상위 구조부터 오프셋 배치 됩니다.

  • 구조체의 크기는 해당 맞춤 보다 큰 가장 작은 배수가 보다 크거나 오프셋 끝의 마지막 구성원입니다.

참고 sizeof(struct Str1) Str1 개체 배열을 작성 되 고 배열 기본 32 바이트 맞춤이 적용 되어 있으면 다음 배열의 각 구성원도 32 바이트로 정렬 됩니다 있도록 32와 같습니다.해당 자료를 제대로 맞춰진 배열을 만들 수 있습니다 _aligned_malloc, 또는 할당 자가 직접 작성 합니다.참고 해당 표준 할당자 등 malloc, C++ new 연산자, Win32 할당자 가능성이 충분히에 대 한 정렬 됩니다 없습니다 메모리를 반환 하 고 **_ _**declspec(align(#)) 구조체 또는 구조체 배열입니다.

sizeof 구조에 대 한 값 오프셋의 마지막 멤버와 해당 멤버의 크기를 가장 큰 멤버 정렬 값 이나 전체 구조 맞춤 값의 가장 가까운 배수로 반올림 중에서 됩니다 더 많은 합니다.

__declspec(align(#))만 맞춤 제한을 늘릴 수 있습니다.

자세한 내용은 다음을 참조하십시오.

  • 맞춤 예제

  • __Declspec(align(#))로 새 형식 정의

  • 스레드 로컬 저장소에서 데이터를 정렬 하기

  • 데이터 압축을 사용 하는 방법 맞춤

  • 구조체 맞춤 예제(x64용)

맞춤 예제

다음 예제에서 볼 방법 __declspec(align(#)) 의 크기와 맞춤 데이터 구조에 영향을 줍니다.예제는 다음과 같은 정의가 있다고 가정합니다.

#define CACHE_LINE  32
#define CACHE_ALIGN __declspec(align(CACHE_LINE))

다음 예제에서는 S1 구조 정의 됩니다 __declspec(align(32)).모든 사용 S1여부, 변수 정의 하거나 다른 형식 선언에 대 한이 구조 데이터 32 바이트 수를 맞춥니다.sizeof(struct S1)32를 반환 하 고 S1 16 패딩 바이트 16 네 개의 정수를 포함 하는 데 필요한 바이트 수를 다음 있습니다.각 int 구성원에 필요한 4 바이트 맞춤 하지만 구조 자체를 맞춤 32, 32 전체 맞춤 때문에 선언 됩니다.

struct CACHE_ALIGN S1 { // cache align all instances of S1
   int a, b, c, d;
};
struct S1 s1;   // s1 is 32-byte cache aligned

다음 예제에서는 sizeof(struct S2) 의 가장 큰 맞춤 요구 사항 (8의 배수)으로 이런 상황이 발생 하기 때문에 16, 구성원 크기의 합계가 정확 하 게 하는 반환 합니다.

__declspec(align(8)) struct S2 {
   int a, b, c, d;
};

다음 예제에서는 sizeof(struct S3) 64를 반환 합니다.

struct S3 {
   struct S1 s1;   // S3 inherits cache alignment requirement
                  // from S1 declaration
   int a;         // a is now cache aligned because of s1
                  // 28 bytes of trailing padding
};

참고 다음 예제에서는 a 만 입력 된 문자가 자연,이 경우에 4 바이트를 했습니다.그러나, S1 32 바이트 정렬 되어야 합니다.20-8 다음에 패딩 바이트 a있도록 s1 32 오프셋에서 시작 합니다.S4다음의 맞춤 요구 사항 상속 S1, 가장 큰 맞춤 요구 사항 구조에서 이기 때문에.sizeof(struct S4)64를 반환합니다.

struct S4 {
   int a;
   // 28 bytes padding
    struct S1 s1;      // S4 inherits cache alignment requirement of S1
};

또한 다음과 같은 세 가지 변수 선언을 사용 하 여 __declspec(align(#)).각각의 경우에는 변수 32 바이트 맞춤 이어야 합니다.배열에는 배열, 각 배열 구성원의 기본 주소를 32 바이트입니다.sizeof 값을 사용 하 여 각 배열 구성원은 적용 되지 않습니다 __declspec(align(#)).

CACHE_ALIGN int i;
CACHE_ALIGN int array[128];
CACHE_ALIGN struct s2 s;

배열의 각 구성원을 정렬 하려면 다음과 같은 코드를 사용 합니다.

typedef CACHE_ALIGN struct { int a; } S5;
S5 array[10];

아래의 예제에서 구조 자체를 정렬 하 고 정렬 하는 첫 번째 요소를 동일한 지를 참고:

CACHE_ALIGN struct S6 {
   int a;
   int b;
};

struct S7 {
   CACHE_ALIGN int a;
               int b;
};

S6및 S7 동일한 정렬, 할당 및 크기 특성을 했습니다.

다음 예제에서는 시작 맞춤 주소를 a, b, c, 및 d 4, 1, 4 및 1을 각각.

void fn() { 
   int a;
   char b;
   long c;
   char d[10]
} 

메모리 힙에 할당 된 경우 맞춤 할당 함수 호출 됩니다 따라 달라 집니다.예를 들어, 사용 하는 경우 malloc, 결과 피연산자가 크기에 따라 다릅니다.경우 arg > = 8 8 바이트 맞춤 맞춤 수 있습니다.If arg < 8, 맞춤 수 있는 첫 번째 전원 2 보다 작은 arg.예를 들어, malloc(7)를 사용 하는 경우 맞춤 4 바이트입니다.

__Declspec(align(#))로 새 형식 정의

맞춤 특성을 정의할 수 있습니다.

예를 들어, 사용자 정의할 수 있습니다의 struct 와 맞춤 값은 다음과 같이:

struct aType {int a; int b;};
typedef __declspec(align(32)) struct aType bType;

이제, aType 및 bType (8 바이트) 크기가 동일 하지만 형식의 변수는 bType 32 바이트 정렬 됩니다.

스레드 로컬 저장소에서 데이터를 정렬 하기

정적 스레드 로컬 저장소 (TLS) 사용 하 여 만든는 __declspec(thread) 특성 및 TLS 섹션에 이미지 works 정상적인 정적 데이터와 정확 하 게 정렬에 대 한 배치입니다.운영 체제 데이터는 TLS 섹션의 크기를 할당 하 고 TLS 섹션 맞춤 특성을 존중 하 여 TLS 데이터를 만듭니다.

다음 예제에서는 스레드 로컬 저장소에 정렬 된 데이터를 저장 하는 방법을 보여 줍니다.

// put an aligned integer in TLS
__declspec(thread) __declspec(align(32)) int a;   

// define an aligned structure and put a variable of the struct type
// into TLS
__declspec(thread) __declspec(align(32)) struct F1 { int a; int b; } a;

// create an aligned structure 
struct CACHE_ALIGN S9 {
   int a;
   int b;
};
// put a variable of the structure type into TLS
__declspec(thread) struct S9 a;

데이터 압축을 사용 하는 방법 맞춤

/Zp 컴파일러 옵션 및 pack pragma가 구조체 및 공용 구조체 멤버에 대 한 데이터 압축의 효과.이 예제를 보여 줍니다 어떻게 /Zp 및 __declspec(align(#)) 함께 작동:

struct S {
   char a;
   short b;
   double c;
   CACHE_ALIGN double d;
   char e;
   double f;
};

다음 표에서 다양 한 각 구성원의 오프셋 /Zp (또는 # pragma pack) 두 가지 상호 작용 하는 방법을 보여 주는 값을 합니다.

변수

/ Zp1

/ Zp2

/ 허용

/ Zp8

{a

0

0

0

0

b

1

2

2

2

c

3

4

4

8

d

32

32

32

32

e

40

40

40

40

f

41

42

44

48

sizeof (S)

64

64

64

64

자세한 내용은 /Zp(구조체 멤버 맞춤)를 참조하십시오.

따라서 개체를 가진 경우에 개체의 오프셋은 이전 개체 및 현재 포장 설정, 오프셋을 기반으로 __declspec(align(#)) 특성을 경우에 맞춤 이전 개체의 오프셋을 기반으로 하는 __declspec(align(#)) 개체에 대 한 값입니다.

참고 항목

참조

__declspec