해결된 질문
작성
·
165
2
#include <stdio.h>
#include <stdalign.h>
int main(void)
{
printf("Alignment of char = %zu\n\n", alignof(char));
char ca;
printf("&ca : %p %lld\n", &ca, ((long long)&ca) % 8);
printf("&ca : %p %lld\n", &ca, ((long long)&ca) % 16);
printf("\n");
char _Alignas(int) cb;
printf("&cb : %p %lld\n", &cb, ((long long)&cb) % 8);
printf("&cb : %p %lld\n", &cb, ((long long)&cb) % 16);
printf("\n");
char alignas(8) cc;
printf("&cc : %p %lld\n", &cc, ((long long)&cc) % 8);
printf("&cc : %p %lld\n", &cc, ((long long)&cc) % 16);
return 0;
}
[결과]
alignas(n)
를 지정하면 주소가 n
의 배수인 메모리 위치에 객체를 할당하도록 하는 것은 이해했습니다.
첫 번째 줄의 출력에서 따로 정렬을 지정하지 않은 ca
는 정렬 값이 1인 것은 확인했습니다.
그러면 ca
의 주소를 8, 16으로 나눈 나머지가 1이므로
&ca : 00000097AA4FF614 1
&ca : 00000097AA4FF614 1
형태의 출력이 나와야 할 것 같은데
왜 4바이트로 정렬을 지정한 cb
와 결과가 같은 것인지 잘 모르겠습니다..
답변 1
2
안녕하세요, 질문&답변 도우미 Soobak 입니다.
혹시, Visual Studio 의 설정을 Debug
모드로 하지는 않으셨는지 확인해보시면 좋을 것 같습니다.
컴파일러는 메모리의 할당 과정에서 시스템의 메모리 정렬 정책 등에 따라서 최적화를 진행합니다.
이 때, Debug
모드와 Release
모드는 최적화 수준과 메모리 레이아웃 관리 방식에서 차이가 존재합니다.
이러한 이유 때문에 다른 결과가 나타나는 것으로 보입니다.
Release
모드에서 컴파일 후 실행해보시면 좋을 것 같습니다.
[Release
모드에서의 프로그램 실행 결과 사진 첨부]
디버그 모드로 실행했던게 맞습니다..
답변 정말 감사드립니다!!