구조체 정렬

Programming/C Language 2009. 9. 27. 15:03
구조체는 구조체 내에 있는 변수 크기에 의해 정렬이 된다.


이는 프로젝트 옵션에서 설정해 줄수도 있다. VS8에서의 모습이다. 프로젝트 속성에 들어가면 "C/C++ -> Code Generation -> Struct Member Alignment " 에서 설정해 줄수 있다. Default 를 주게되면, 앞서 말한대로 구조체 멤버크기에 맞춰서 하게 된다. 컴파일러 에서는 옵션에서 설정 된 값과, 구조체 멤버 크기 중에 작은 쪽에 맞추어 정렬을 한다.

구조체 정렬 기능에 의해 멤버들이 구조체 내의 어느 오프셋에 배치될지는 미리 예측하기 어렵다. 설사 계산 가능하다 하더라도 옵션을 바꾸면 오프셋이 다시 바뀔 수 있으므로 암산으로 계산한 오프셋을 사용하는 것은 바람직하지 않다. 만약 특정 멤버가 배치된 오프셋을 조사하고 싶다면 stddef.h에 다음과 같이 정의되어 있는 offsetof 매크로 함수를 사용한다. 

#define offsetof(s,m)   (size_t)&(((s *)0)->m) 

첫 번째 인수로 구조체, 두 번째 인수로 멤버의 이름을 주면 이 멤버가 실제로 배치된 오프셋을 리턴한다.

#include <Turboc.h>
#include <stddef.h>

void main()
{
     struct Node { 
          int a; 
          double b; 
          char c[16]; 
          Node *prev; 
          Node *next; 
     };

     Node A, B;
 
    printf("a의 오프셋 = %d\n",offsetof(Node,a));
    printf("b의 오프셋 = %d\n",offsetof(Node,b));
    printf("c의 오프셋 = %d\n",offsetof(Node,c));
    printf("prev의 오프셋 = %d\n",offsetof(Node,prev));
    printf("next의 오프셋 = %d\n",offsetof(Node,next));
}

실행 결과는 다음과 같다. 

a의 오프셋 = 0
b의 오프셋 = 8
c의 오프셋 = 16
prev의 오프셋 = 32
next의 오프셋 = 36

만약 구조체 전체가 아니라 특정 멤버 앞쪽의 멤버만 복사하고 싶다면 이 멤버의 오프셋을 알아야 하는데 이때 offsetof 매크로가 유용하게 사용된다. 예를 들어 A 구조체의 링크 정보는 빼고 실제 데이터만 B로 복사하고 싶다면 memcpy(&B,&A,offsetof(Node,prev)); 하면 된다.

출처 : www.winapi.co.kr

'Programming > C Language' 카테고리의 다른 글

new int(3) 과 new int[3]  (0) 2010.05.27
#if  (0) 2010.05.27
#include 와 #define 의 순서  (0) 2009.08.18
매크로 함수  (0) 2009.08.18
코딩 스타일  (0) 2009.08.15

설정

트랙백

댓글