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

쉽지않네님의 프로필 이미지
쉽지않네

작성한 질문수

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

15.12 메모리 줄맞춤 alignof, alignas

15.12강 질문이 있습니다.

해결된 질문

작성

·

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 모드에서의 프로그램 실행 결과 사진 첨부]
image

image

쉽지않네님의 프로필 이미지
쉽지않네
질문자

디버그 모드로 실행했던게 맞습니다..

답변 정말 감사드립니다!!

쉽지않네님의 프로필 이미지
쉽지않네

작성한 질문수

질문하기