본문 바로가기
Programming/C++

[C++] static const에 대한 고찰

by ★용호★ 2013. 4. 11.

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;


void main()

{

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

댓글