[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이다. --> 확인 필요...
 

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/121

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/121

트랙백 주소 :: http://www.cipher.pe.kr/tt/cipher/trackback/121

트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/trackback/121

트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/trackback/121

댓글을 달아 주세요

댓글 RSS 주소 : http://www.cipher.pe.kr/tt/cipher/rss/comment/121
댓글 ATOM 주소 : http://www.cipher.pe.kr/tt/cipher/atom/comment/121
[로그인][오픈아이디란?]