2013-08-10 4 views
6

, 입니다. http://msdn.microsoft.com/en-us/library/83ythb65.aspx 하지만 나에게 명확하지 않습니다. 무엇보다도 먼저 __declspec(align(#))은 구조체에서 선언 된 모든 객체가 정렬 된 오프셋에서 시작하도록합니다. 그 부분은 분명합니다. 또한 객체가 들어있는 구조체에 의해 '상속'됩니다. 그러나 객체의 크기는 변경되지 않습니다. 그렇습니까?`__declspec (align (#))`은 어떻게 작동합니까?

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

반환 32 : 정확하게, 왜이 코드에서 sizeof()합니까?

답변

12

개체의 크기는 배열의 오프셋을 계산할 때 사용되며 포인터를 사용할 때 sizeof(x)은 항상 정렬 값의 배수 여야합니다. 이 경우 1 x 32입니다. 그러나 __declspec(align(32)) struct aType {int a[12]; }; 인 경우 sizeof (a)는 12 x 4 = 48이므로 크기는 2 x 32 = 64가됩니다. 4, 8 또는 16으로 맞추기 위해 크기를 변경하면, 그것은 48이 될 것입니다.

실제로 작동하는 방식은 컴파일러가 구조체의 명명 된 멤버 뒤에 unamed 패딩 멤버를 추가하여 구조체를 정렬 크기로 채우는 것입니다. 그것은이 방법을 작동하지 않은 경우

, 뭔가 같은 : 컴파일러가 내부적으로 aPtr에 추가 sizeof(aPtr)에 의해 12를 곱 때문에

aType *aPtr = new aType[15]; 

aPtr[12].a = 42; 

은 바로 작동하지 않을 것입니다.

+0

실제로 ** 구조체/객체의 크기가 ** 변경됩니까? – NPS

+2

예,'struct'는 이제 32 바이트입니다. 2 개의 정수의 경우 8 바이트, 그 중 24 바이트는 "필러"로 배열의 첫 번째와 두 번째 aType 객체 사이의 공백을 채 웁니다. –

+0

자, 그럼 왜 여기에 :'struct aType {int a; int b;}; typedef __declspec (align (32)) struct aType bType; '정렬 만 변경하고 크기는 변경하지 않습니다 ([MSDN] (http://msdn.microsoft.com/pl-pl/library/83ythb65.aspx) __declspec (align (#)) ")을 사용하여 새 유형 정의? – NPS

0

설명서가 제대로 작성되지 않았거나 외국어로서의 영어 명령이 동등하지 않습니다.

// make a nice 16 align macro 
#ifndef ALIGN16 
#define ALIGN16 __declspec(align(16)) 
#endif 

// align the structure 
struct ALIGN16 CB { 
    ALIGN16 bool m1; // and 
    ALIGN16 int m2; // align 
    ALIGN16 int m3; // each 
    ALIGN16 short m4; // element 
}; 

// now it performs as expected 
printf("sizeof(CB) %d\r\n", sizeof(CB)); 
CB vCb; 
printf("CB: %p, %%%d\r\n", &vCb, (UINT_PTR)&vCb % 16); 
printf("CB.m1: %p, %%%d\r\n", &vCb.m1, (UINT_PTR)&vCb.m1 % 16); 
printf("CB.m2: %p, %%%d\r\n", &vCb.m2, (UINT_PTR)&vCb.m2 % 16); 
printf("CB.m3: %p, %%%d\r\n", &vCb.m3, (UINT_PTR)&vCb.m3 % 16); 
printf("CB.m4: %p, %%%d\r\n", &vCb.m4, (UINT_PTR)&vCb.m4 % 16); 

__declspec(align(#))은 구조의 정렬과 sizeof(), NOT 그 안에 각 멤버에 영향을 미칩니다. 각 속성을 정렬하려면 멤버 수준에서 정렬을 지정해야합니다.

나는 또한 처음에는 struct-level __declspec(align())이 영향을 미치며 회원이지만 실제로는 그렇지 않다고 가정했습니다. 따라서 회원별로 정렬을 원한다면 구체적이어야합니다.