[code type=c]#include <stdio.h>
struct s0
{
int a;
short int b;
signed char c;
signed char d;
};
struct s1
{
short int b;
int a;
signed char c;
signed char d;
};
struct s2
{
int a;
signed char c;
int x;
signed char y;
};
#define offsetof(type, member) \
((unsigned int) &((type *)0)->member) /* 주어진 구조체의 첫번째 주소를 0으로 삼아서 뒤에 있는 것들의 주소를 보여 달라. */
int main(void)
{
printf("sizeof(s0) = %d\n", sizeof(struct s0) );
printf("sizeof(s1) = %d\n", sizeof(struct s1) );
printf("sizeof(s2) = %d\n", sizeof(struct s2) );
printf("offsetof(s1, b) = %d\n", offsetof(struct s1, b));
printf("offsetof(s1, a) = %d\n", offsetof(struct s1, a));
printf("offsetof(s1, c) = %d\n", offsetof(struct s1, c));
printf("offsetof(s1, d) = %d\n", offsetof(struct s1, d));
return 0;
}[/code]
실행 결과
sizeof(s0) = 8
sizeof(s1) = 12
sizeof(s2) = 16
offsetof(s1, b) = 0
offsetof(s1, a) = 4
offsetof(s1, c) = 8
offsetof(s1, d) = 9
------------------------------
Visual C++과 MinGW로 같은 결과가 나온다.
s0, s1, s2의 sizeof 결과가 다른 이유
현 시스템이 32bit 이므로 4 byte 기준이다. 따라서 가장 빠른 속도로 메모리 억세스 할 수 있는 것이 32bit 즉 4 byte 이다. 속도를 최대로 올리기 위해서 메모리상에 4 byte 단위로 값을 저장하고 기억할려고 한다.
1. s0를 보면 처음 4 byte에 a가 저장되고 그 다음 2 byte에 b가 저장되고 나머지 2 byte에 1 byte씩 저장되므로 8 byte를 필요로 한다. 4 + 4( 2 + 1 + 1) 이므로 8 byte
2. s1을 보면 처음에 있는 b의 2 byte를 저장하고 나머지 2 byte에 그 뒤에 있는 4 byte 값을 한꺼번에 저장이 안되므로 뒤의 2 byte는 비워두고 다음 4 byte에 a를 저장한다. 그 다음에 1 byte 씩 두개 저장할 수 있으므로 총 4(2byte만 쓰고 2byte는 쓰레기값) + 4 + 4(1 + 1, 나머지는 쓰레기값) 이므로 12 byte이다.
3. s2는 a가 4 byte를 차지하고 c가 1 byte를 차지한다. 그리고 다시 4 byte가 있어야 하고, 다시 1 byte가 존재 해야 한다. 즉 4 + 4 (1byte만 사용) + 4 + 4(1 byte만 사용) 이므로 총 16 byte 이다.
offsetof의 경우 매크로 함수를 사용하여 각 구조체 필드의 첫번째 주소를 알아 보는 것이다.
일반적으로 주소를 보면 메모리상의 실제 주소가 나오지만, (type *)0 때문에 구조체 필드의 첫번째 필드를 0으로 하는 상대 주소를 알려 준다.
C언어에서 정보를 가지고 올 수 있는 최소 단위는 byte이다. 공용체를 이용하여 bit 연산자를 쓸 수 있기도 하지만, 기본적으로 byte 단위이다.
#pragma pack(1)을 활용하면 읽는 속도와 상관없이 최소화한 상태로 나온다. 즉 언제나 8 byte이다. --> 확인 필요...
받은 트랙백이 없고,
댓글이 없습니다.



글
댓글을 달아 주세요
댓글 RSS 주소 : http://www.cipher.pe.kr/tt/cipher/rss/comment/121댓글 ATOM 주소 : http://www.cipher.pe.kr/tt/cipher/atom/comment/121