작성
·
288
0
질문 1)
double dx;
char ca;
int it;
double ddr;
printf(" %lld\n", (long long)&dx % 8);
printf(" %lld\n", (long long)&ca % 8);
printf(" %lld\n", (long long)&it % 8);
printf(" %lld\n", (long long)&ddr % 8);
이 코드를
비주얼 스튜디오에서 돌리면 dx와 ddr의 주소를 %8한 값이 0으로 안나올 때가 많습니다. online gcc compiler와 다르게 왜 안나오는지 궁금합니다.
근데 제 생각에는 안나오는게 정상인 것 같습니다. alignof를 쓰지 않고 online gcc compiler처럼 딱 맞게 나오려면 double형은 항상 메모리 주소가 8의 배수고 int형은 4의 배수 이런식으로 메모리상에 주소를 배치 받아야 되지 않습니까? online gcc compiler는 내부적으로 이렇게 굴러가는 건지도 궁금합니다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
질문2)
char alignas(8) cz;를 하고
printf(" %lu\n", _Alignof(cz));를 하면 8이 출력됩니다.
이렇게 cz의 메모리상 배치를 강제로 8의 배수로 하면
왠지 메모리 패딩같은게 일어날 것 같은데 실제 메모리 내부적으로 어떻게 처리 되는지 궁금합니다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
질문 3)
마지막에 배열을 만들때도 alignas를 사용한다고 하셨는데
unsigned char alignas(long double) c_arr[10];
에서 unsigned char 방이 10개가 있는데 그 10개의 방 모두 long double로 alignment를 지정해준 건가요?
답변 3
1
아 x64로 하니까 잘 되네요!
질문 3은
unsigned char _Alignas(long double) c_arr[19];
printf("_Alignof(c_arr) = %lu\n", _Alignof(c_arr));
printf("_Alignof(c_arr[0]) = %lu\n", _Alignof(c_arr[0]));
printf("_Alignof(c_arr[17]) = %lu\n", _Alignof(c_arr[17]));
printf("(long long)(&c_arr[0]) 16 = %lld\n", (long long)(&c_arr[0]) %16);
printf("(long long)(&c_arr[1]) 16 = %lld\n", (long long)(&c_arr[1]) %16);
printf("(long long)(&c_arr[17]) 16 = %lld\n", (long long)(&c_arr[17]) %16);
이렇게 구현 해봤는데 출력이 위에서부터
16
1
1
0
1
1
이렇게 나오더라구요.
제 생각에는 배열의 첫 주소만 (long double) 16배수로 잡아준것 같아서 주소값을 직접 출력해보니
printf("(long long)(&c_arr[0]) 16 = %lld\n", (long long)(&c_arr[0]));
printf("(long long)(&c_arr[1]) 16 = %lld\n", (long long)(&c_arr[1]));
printf("(long long)(&c_arr[17]) 16 = %lld\n", (long long)(&c_arr[17]));
결과가
...5136
...5137
...5153
이렇게 나오던데 배열의 첫 주소만 16배수로 잡아준다는 제 생각이 맞는 건가요?
1
안녕하세요?
첫번째 질문은 아마 platform을 x86으로 하신 것이 아닐까 생각되는군요.
double의 size는 8 byte이고, x86 에서는 register의 크기가 4 byte이기 때문에 다르게 적용됩니다.
두번째 질문은 생각하신대로 나머지 부분은 비어있게 됩니다.
세번째 질문에 대해서는 출력을 해보시는 것을 권해드리고 싶군요.
0
안녕하세요?
작성하신 코드대로라면 배열을 align할 때 16을 최소 단위로 하게됩니다.
왜 align을 해야하는지에 대해서 고민해보심이 좋을 것 같으나.. 이 강의로부터는 아마 감이 안오실 수 있고 필요한 내용을 공부하셔야 될 겁니다.