티스토리 뷰
※ 본 포스팅은 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있음을 밝힙니다.
struct member alignment를 한글로 직역하면 구조체 멤버 정렬 정도가 된다. 이 정렬은 프로세서의 성능저하를 방지하기 위함이며, 구조체 멤버를 사용할 시 메모리상의 특정 배수 값에 위치한 메모리에 둠으로써 효율적으로 메모리를 읽겠다는 소리인데, 대신에 구조체 내에서 변수선언 순서에 따라 같은 자료형의 구조체라도 전체 크기가 달라질 수도 있단 소리다.
다음 코드를 보자
struct member { int a; char b; int c; double d; }
구조체 멤버 정렬에 의하면 가장 크기가 큰 자료형의 배수로써 메모리 크기가 구분된다. 이를 실행시키면
가 된다. 좀 더 가독성을 높이기 위해 그림으로 표현하자면
가 된다.(실형결과 주소 값의 뒷 두자리가 그림의 주소 값) 처음에 int a가 24부터 28까지 할당된다. 그리고 char b가 28에 1 byte 할당된다. 가장 큰 자료형이 double이므로 8의 배수로써 할당되는데. 이에 따르면 다음 29~32 사이나 32 이상에 다음 자료형이 할당될 수 있다. 다음은 int c가 할당되어야 하는데, int는 4 byte 자료형으로써 29~32에 할당될 수 없으니 32번지에 할당된다. 다음 8의 배수 주소 번지는 40으로써 다음번 자료형은 36~40 혹은 40이상 값에 할당 될 수 있다. 이제 double d를 할당되는데 double은 8 byte 임으로 36~40에 할당될 수 없다. 그래서 40에 할당이 된다.
이제 이로 인해 같은 자료형이 든 구조체가 어떻게 다른 값을 가질 수 있는지를 보자. 다음 코드를 보자.
#include "stdio.h" //2. struct member alignment 조사 및 예제 struct member1 { int a; char b; char c; int d; double e; }; struct member2 { char a; double b; int c; char d; int e; }; void main() { struct member1 ex1; struct member2 ex2; printf("member1의 크기 : %d\n", sizeof(ex1)); printf("member1.a(int) : %d(%d byte)\n", &ex1.a, sizeof(ex1.a)); printf("member1.b(char) : %d(%d byte)\n", &ex1.b, sizeof(ex1.b)); printf("member1.c(char) : %d(%d byte)\n", &ex1.c, sizeof(ex1.c)); printf("member1.d(int) : %d(%d byte)\n", &ex1.d, sizeof(ex1.d)); printf("member1.d(double) : %d(%d byte)\n", &ex1.e, sizeof(ex1.d)); printf("============================================\n"); printf("member2의 크기 : %d\n", sizeof(ex2)); printf("member2.a(char) : %d(%d byte)\n", &ex2.a, sizeof(ex2.a)); printf("member2.b(double) : %d(%d byte)\n", &ex2.b, sizeof(ex2.b)); printf("member2.c(int) : %d(%d byte)\n", &ex2.c, sizeof(ex2.c)); printf("member2.d(char) : %d(%d byte)\n", &ex2.d, sizeof(ex2.d)); printf("member2.e(int) : %d(%d byte)\n", &ex2.e, sizeof(ex2.e)); }
이 코드는 두 개의 구조체를 선언한 후 각각 int 자료형 2개, char 자료형 2개, double 자료형 1개가 선언 되었으며, 선언 순서만 다르다. 이를 실행시켜 보면
이 된다. 분명 같은 자료 형들이 들어있고 각 자료형들의 크기를 합하면 18 byte지만 선언 순서에 따라 두 구조체의 전체 크기는 다른 것을 볼 수 있다. 이를 그림으로 나타내면
가 된다. 끝나는 지점 역시 가장 큰 자료형인 8의 배수를 따라야 함으로 member1의 경우 24에서 끝나고 member2는 32에서 끝난다.
'개인공부 > C and C++' 카테고리의 다른 글
[C 언어] rand(), srand()를 사용한 난수 발생 예제 (2) | 2014.09.18 |
---|---|
fseek와 ftell 함수 (0) | 2014.01.17 |
구조체 파일 위치 지시자 (0) | 2014.01.17 |
realloc, calloc 함수 및 예제 (1) | 2014.01.16 |
strlen, strcmp, strcat, strcpy, strrev, strtok, atoi, itoa 설명 및 함수로 구현 (0) | 2014.01.16 |
Call by value와 Call by reference에 대해 (5) | 2014.01.16 |
컴파일러(Complier), 링커(Linker)에 대해 (1) | 2014.01.16 |