struct INFO { double a, b; };
struct { int num; INFO ar[1024]; } data;
int main ()
{
void* ptr;
int num;
INFO *ar_1, *ar_2;
// initialize my data
data.num = 2;
data.ar[0].a = 0.1;
data.ar[0].b = 0.2;
// retrieve each value from the data from a (void*) type pointer
ptr = &data;
num = *(int*)ptr;
ar_1 = (INFO*)((int*)ptr + 1);
ar_2 = (INFO*)((int*)ptr + 2);
// result : num is 2
printf("num is %d \n", num);
// result : ar_1 points to (0.0, 0.0),
// which is wrong value
printf("ar_1 points to (%lf, %lf) \n", ar_1[0].a, ar_1[0].b);
// result : ar_2 points (0.1, 0.2),
// which is correct value
printf("ar_2 points to (%lf, %lf) \n", ar_2[0].a, ar_2[0].b);
return 0;
}
나한테 구조체 data 가 있는데
data는 처음 4 바이트가 int num 이고
그 뒤로 배열 데이타가 있으니까
ar_1 = (INFO*)((int*)ptr + 1);
이 ar_1 이 배열 데이타를 가리키고 있을줄 알았는데
ar_2 = (INFO*)((int*)ptr + 2);
이 ar_2 한테서 배열 데이타가 올바르게 읽어 지더라고
왜 이런건지 모르겠다. 눅누가 설명좀
배열은 1부터읽어지니까 그런거아님?
memory alignment 문제임.
INFO 는 double 단위기 때문에 메모리 주소를 8 바이트 단위로 접근하고 싶어함.
그래서 ~~~0008 ~~~~0010 이런 식의 16진수 주소에 배치되지.
그런데 int 는 int 단위기 때문에 메모리 주소를 4 바이트 단위로 접근하고 싶어함.
맞오 더블은 8이얌
그러니 ~~ 0004 ~~~0008 ~~000C ~~~0010 이런식의 16진수 주소에 배치되지.
그러니 int 와 double배열을 함께 쓸 경우, int 4바이트 뒤에 여백 4바이트를 포함하게 됨.
그렇게 해야 속도가 빠르거든.
그걸 막기위해선 preprocessor directives 를 이용해서 pack(1) 처럼 1바이트 단위 패킹을 쓸 수 있는데.
그러면 성능이 좀 떨어짐.
즉 니가 char, int, double 을 차례로 선언했다면, 1 바이트 캐릭터, 3바이트 여백, 4 바이트 int, 8 바이트 double 순으로 메모리에 적재됨. double 이 등장하기 전에 메모리 사용량이 8의 배수였기 때문에 int 와 double 사이에선 여백이 생기지 않음.
codesfa// ㄳㄳ 오줌누고와서 읽어봄
만약 니가 short, int, short, 를 구조체 선언한다면 short short int 보다 메모리 낭비가 커지지.
처음 short 와 그 다음 int 사이에 2바이트 여백이 있어야 int 가 4바이트 정렬주소에 배치되니까.
난 밥먹으러감~
http://m.blog.naver.com/since860321/130162996293
패딩비트에
대해 설명한 게시글이니 읽어보면 도움될듯 - dc App