인프런 커뮤니티 질문&답변

오종화님의 프로필 이미지
오종화

작성한 질문수

홍정모의 따라하며 배우는 C언어

15.12 메모리 줄맞춤 alignof, alignas

비주얼 스튜디오 alignment 질문있습니다.

작성

·

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을 해야하는지에 대해서 고민해보심이 좋을 것 같으나.. 이 강의로부터는 아마 감이 안오실 수 있고 필요한 내용을 공부하셔야 될 겁니다.

오종화님의 프로필 이미지
오종화

작성한 질문수

질문하기