2013년 1월 7일
전역변수나 static으로 선언된 변수는 메모리의 데이터영역에 보관이 되고 있는데
이펙티브 C++을 보던중에 전역으로 선언된 static const 변수는 메모리가 잡히지 않을 거라고하는 부분이 있었다.
구체적으로는 이유가 적혀 있지 않고 언급만 되어 있어서 기욱이형이랑 테스트 해본 결과 정말 그 부분에서만
메모리 주소를 알 수가 없었다..
읽고 쓸수 있는 RAM에 저장 되지 않고 ROM에 저장이 된다 정도의 확실치 않은 정보만 얻을 수 있었다.
static const int a = 3; main() { int *b = &a; printf("%d\n", &a); } |
물어물어 알아본 결과 전역 static const 의 경우 쓰이는 부분이 없다면 메모리에 올리지 않고, main에서 처럼 쓸려고 할때
메모리에 잡히게 된다는 좀 확실치 않은 대답만 들은 상태여서 긴가 민가 한 상태!
이펙티브 C++로 인해서 무지하게 고민하게 된 이문제가.. 인터넷 뒤져보니 이펙티브 C++에 답이 있었다. 또한 진리의 msdn에도 답이 있었다.
http://msdn.microsoft.com/ko-kr/library/0d45ty2d(v=VS.80).aspx
바로 static const, 전역 상수는 컴파일러의 최적화에 의해 변수에 대한 공간을 예약해 두지 않는 다는 것!
리터럴 : 컴파일시 프로그램 내에 정의되어 있는 그대로 정확히 해석되어야 할 값을 의미한다. 이에 비해, 변수란 프로그램의 실행 중에 상황에 따라 다른 값들을 표현할 수 있으며, 상수는 프로그램 실행 중 늘 같은 값을 표현한다. 그러나 리터럴은 명칭이 아니라, 값 그 자체이다. 예를 들어 x = 7 에서 "x"는 변수이며 "7"은 리터럴이다.
이에 덧붙여 짱강사님께 질문 드린 것에 대한 답변 :
상수화 변수의 경우 컴파일러가 사용자 정의 리터럴 상수화하기 때문에 그렇습니다.
즉, 전역 스코프의 상수화 변수나 정적 상수화 멤버의 경우 data영역에 잡히지 않습니다.
data영역은 메모리의 내용을 읽거나 쓸 수 있는 권한으로 지정된 영역이기 때문이라고 생각하시면 되겠네요.
프로그램 내에 사용자 정의 리터럴 상수들은 읽기 권한으로 보호된 메모리 영역에 존재하게 됩니다.
다음과 같은 문자열 리터럴 상수("hello")의 경우도 마찬가지입니다.
char *a = "hello";
char *b = "hello";
그렇지만 사용자 정의 리터럴 상수도 프로그램 내에 존재하는 것이기 때문에 당연히 할당된 메모리 주소를 알 수는 있습니다.
static const int a = 3;
{ const int *b = &a; printf("%d\n", &a); }
|
즉, 위에 코드는 성립한다는 것입니다.
RAM에 잡히는가? ROM에 잡히는가? 이것은 엉뚱한 질문이 될 수 있습니다. 다시 한 번 살펴보세요.
참고) Win32API에서 가상 메모리를 할당을 하는 부분을 보시면 할당받는 Page를 쓰기만 가능하게 할 것인지
읽기만 가능하게 할 것인지 등을 지정하게 할 수 있다는 것을 상기해 보시기 바랍니다.
역시 강사님의 말씀도 진리..ㅠㅠ
'Programming > C++' 카테고리의 다른 글
[C++] IOCP에서 패킷 처리 관련 (2) | 2014.05.10 |
---|---|
[C++] inet_addr, htons 함수 (1) | 2013.04.11 |
[C++] strtok 함수 (0) | 2013.04.11 |
[C++] ifstream 클래스 (0) | 2013.04.11 |
[C++] 생성자 호출과 기본 타입 캐스팅간 우선순위 (0) | 2012.09.26 |
댓글