구조체가 가지는 메모리공간에 대한 질문이요
뽀야
구조체가 가지는 메모리 공간
질문 내용 :
struct fri{
char a[15];
char b[10];
float c,d;
};
이러한 구조체가 있을 때요
계산해 보면 32byte로 나오는데
sizeof 로 계산해보면 왜 36바이트가 나오는거죠?
그리고 각각의 메모리 번지를 구해보니까
1245020
1245035
1245048
1245052
이런식으로 b와c사이에 간격이 일치하지 않는데 왜 그런거죠?
-
보단
비트필드 -_ㅡ;;
-
소윤
^^ 위에 말씀한것 처럼 기본적으로 시스템은 4byte로 최소의 단위로 처리합니다.
4byte로 안나뉘는 것은 그 곳을 padding하고 건너 뛰죠....
그래서 위의 구조체데이타를 실제 메모리 사이즈로 보면
a : 15 + 1(padding:dummy 쓰레기)
b: 10 + 2(padding)
c ,d : 4*2
16+12+4*2 = 36이 나오는 거죠...
33이 나오게 하는 방법은 아래와 같이 선언하면 위의최소 단위가 1로 되어서 3 -
단순랩퍼
게다가... 컴파일러마다 또는 OS마다.. 저장 방식이 조금씩 다르기 때문에..
(비주얼스투디오는 컴파일 옵션텝에 보면 블럭 사이즈를 지정할 수 있습니다..)
서로 다른 시스템 간에 unpacked된 구조체 데이터를 주고 받다 보면
데이터가 깨지는 경우도 종종 발생합니다.. -
연블랙
일반적으로 구조체 참조연산자인 .연산자는 각 멤버의 사이즐 다 계산 해야하는 부담감이 있습니다.
당연히 속도가 느려지겠죠.. 그래서 보통은 한 word (보통 2/4바이트) 단위로 데이타를 저장합니다.
그래서 빈공간이 생기고.. 실제 구조체의 사이즈는 전체 멤버의 사이즈보다 커지게 됩니다..
용량이 큰 구조체 배열을 사용해야할 경우 그런 공간의 낭비가 심각해지므로
컴파일러는 packed 하게 빈공간 없이 저장할 수 있도록 하기도 합니다..
구조체 멤