inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

15.12 메모리 줄맞춤 alignof, alignas

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

441

오종화

작성한 질문수 7

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를 지정해준 건가요?

c

답변 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

Hello Yeo

안녕하세요?
첫번째 질문은 아마 platform을 x86으로 하신 것이 아닐까 생각되는군요.
double의 size는 8 byte이고, x86 에서는 register의 크기가 4 byte이기 때문에 다르게 적용됩니다.
두번째 질문은 생각하신대로 나머지 부분은 비어있게 됩니다.
세번째 질문에 대해서는 출력을 해보시는 것을 권해드리고 싶군요.

0

Hello Yeo

안녕하세요?

작성하신 코드대로라면 배열을 align할 때 16을 최소 단위로 하게됩니다.

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

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

51

3

main 함수에서 왜 int만 선언이 되는걸까요

1

56

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

54

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

49

1

프로토타입과 함수간의 인자 불일치

1

73

2

12.12 헤더 관련 질문

1

60

2

Visual Studio Community 2026 사용 문의

1

137

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

60

2

getchar(), putchar()

1

93

3

강의자리ㅛ

1

79

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

112

2

소스파일안에 여러 파일

1

75

2

F5와 F7의 차이

1

76

2

c = TWO * (a+b); 에서 a와 b는?

1

58

2

; 세미콜론을 붙이는 기준에 문의

1

68

1

Step over 기능 문의

1

53

2

2.6 강의 따옴표 출력 규칙 문의

1

74

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

60

2

11.7 함수를 구현해 봤습니다.

1

62

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

64

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

53

2

11.6 fit_str함수를 구현해 봤습니다.

1

53

2

11.5 코드 구현

1

67

2