작성
·
30
·
수정됨
1
질문 자체가 이상해서 취소선으로 변경했습니다.
const float PI의 경우 4 byte 크기가 나오게 되는데
#define PI는 컴파일 하기 전에 PI부분을 4.131692f로 바꾸게 되잖아요. 그러면 그 상수 부분도 똑같이 float이니깐 4 byte 크기를 차지하게 되는 걸까요?
입력하는 상수들이 모두 각각 메모리를 차지하는 건지도 생각해 본 적이 없었는데, 갑자기 궁금해져서 질문 드립니다!
답변 2
0
안녕하세요? 질문&답변 도우미 durams입니다.
정확히 어떤 것을 여쭤보고 계신지 잘 이해하지 못했지만, 최대한 설명을 드리려합니다.
#define으로 매크로를 정의하는 경우, preprocessor(전처리기) 단계에서 일치하는 심볼(기호)을 찾아 정의한 내용으로 교체하게 됩니다.
#define PI 3.141592f
const float temp = PI;그래서 위 코드는 아래 코드와 사실상 같습니다.
const float temp = 3.141592f;temp도 똑같이 4바이트 공간을 차지하게 되겠죠. 약간 수정해서 아래처럼 사용할 수도 있습니다.
#define PI 3.141592f
const double temp = PI;이런 경우에는 3.141592f라는 리터럴은 temp의 초기화에 사용될 때 double로 암시적으로 형변환이 발생하게 되고, temp 변수는 8바이트를 차지하게됩니다.
런타임에 사용되는 메모리는 매크로의 정의보다는 실제로 그 매크로를 어떻게 사용하는지에 따라 달라진다고 보는 것이 옳습니다. 또한 매크로 상수를 정의하는데 사용된 리터럴(3.141592f) 자체는 .rodata section에서 별도로 공간을 차지하고 있기도합니다.
더 궁금한 점이 있으시다면 질문 주세요.
아 리터럴이 실제로 공간을 차지하는지에 대한 질문이었군요. 리터럴도 물론 공간을 차지합니다. 아마 선생님께서 expression의 평가가 일어난 뒤 사라진다고 말씀하신건 해당 리터럴이 스택과 힙 같은 동적 영역에 존재하지 않는 값임을 전달하시려 했던 것 같습니다. 대신 리터럴은 변수와는 조금 그 결이 다르다고 해야할까요?
나중에 배우실 12. 1 메모리 레이아웃 훑어보기에서도 간단히 알아볼 예정인데, 간단히 디테일을 조금 더 설명드릴게요. (참고용으로만 보셔도 충분합니다)
먼저 변수는 어떻게 선언하느냐에 따라 다른 곳에 저장될 수 있습니다. 대표적으론 스택과 힙에 위치할 수 있고, 전역 변수의 경우는 .data section이나 .bss section에 위치하게됩니다.
리터럴도 사실 경우에 따라 달라질 수 있는데요, 모든 리터럴은 읽기 전용 데이터로써 대부분 .rodata section에 위치하게 되지만(문자열 리터럴의 경우 거의 이곳에 위치하게 됩니다), 말씀해주신 2+2와 같은 크기가 작은 리터럴의 경우는 .text section에 임베디드(또는 인라인)되어 포함될 수도 있습니다.
앞선 설명들에서 제가 말씀드린 .data, .bss, .text와 같은 section들은 오브젝트 파일 내에서 각 구획들을 가리키는 용어입니다. 관심이 있으시다면 ELF (Executable and Linkable Format)에 대해서 검색해보세요.
전혀 멍청한 질문은 아니었어요. 그냥 그렇구나 하고 넘어가는 것보다 의문을 가지시고 파고드는게 정말 좋은 습관이거든요. 앞으로도 질문 많이 해 주세요.
친절한 답변 정말 감사합니다 😁
주신 답변이 아직 제가 지식이 부족해 완전히 이해가 되지 않지만, 메모리 어딘가에 공간을 차지는 하게 된다는 점은 인지가 되었습니다.
말씀해주신 12.1 단원에 도달했을 때는 더 이해가 되었으면 좋겠네요.
0
안녕하세요, 인프런 AI 인턴입니다. Lucas님 질문에 답변드리겠습니다.
#define과 const float는 각각 다른 방식으로 메모리에 영향을 미칩니다.
#define PI 4.131692f:
PI를 만날 때마다 4.131692f로 대체됩니다.PI 자체는 메모리에 저장되지 않으며, 프로그램이 컴파일될 때 상수 값으로 변환됩니다.const float PI = 4.131692f;:
PI라는 이름과 함께 실제로 값을 저장합니다.4 byte를 차지하게 됩니다.결과적으로 #define 방식은 메모리에 따로 값을 저장하지 않고, 단순히 코드를 치환하기 때문에 그 자체로는 추가 메모리를 사용하지 않습니다. 그러나 실제로 상수를 여러 번 사용하게 될 경우 사용되는 메모리는 const float보다 더 많아질 수 있습니다.
보다 자세한 설명은 아래 링크를 참고해 보세요:
- C언어에서의 매크로와 상수 사용법
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
제 질문의 의도가 제대로 전달되지 못한 것 같아 죄송합니다.
'코드 상에 단순히 리터럴 상수로 쓴 숫자들도 각 데이터 형식에 맞게 메모리를 차지하게 되는가'가 제 질문이었습니다.
예를 들면
이건 a에 가리키는 4 byte 크기 메모리 공간에 2를 저장해 둔다이고
질문의 경우 단순히 이런 경우였습니다.
그런데 이후 수업을 듣다보니 expression(표현식) 부분을 값을 구한 뒤 사라진다고 선생님이 언급하신 부분이 있었습니다.
저 때는 왜 저런 생각이 들었는지 참.... 멍청한 질문이었네요 😅