클래스 멤버로 선언된 상수의 초기값이 저장되는 메모리 위치는?
글쓴이: thnkdiff / 작성시간: 수, 2012/02/08 - 11:59오후
요즘 Effective C++ 책을 보고 있는데요, 거기 아래와 같은 코드가 나옵니다.
class GamePlayer { private: static const int NumTurns = 5; int scores[NumTurns]; ... };
여기에서 NumTurns는 '정의'가 아니라 '선언'된 것이구요,
이 상수의 주소값을 구하지 않는 한, 이렇게 정의 없이 선언만 해도 문제가 없다고 나옵니다.
만약 어딘가에 이 상수의 주소값을 구하는 코드를 쓰게 되면, 구현 파일에 아래와 같이 상수의 정의를 해야한다고 합니다.
const int GamePlayer::NumTurns;
여기에서 궁금한 것이 생겼습니다.
상수가 '정의' 없이 '선언'만 되었다면 이 상수를 위한 공간이 메모리 상에 생기지 않았을텐데요,
(그래서 아마도 이 상수의 주소값을 구하지 못하는 것일 테구요)
그렇다면 5라는 값은 메모리 상의 어디에 저장이 되는 것일까요?
주소값을 구하는 코드가 없다면, '정의' 없이 '선언'만 하고도 GamePlayer 클래스의 멤버함수들 내에서는
NumTurns 상수에 접근해서 5라는 값을 사용할 텐데요, 그렇게 하려면 5라는 값이 메모리 어딘가에는 저장되어 있어야 할 것 같은데
아직 정의가 안 된 상수이니 메모리 어디에 5라는 값을 저장해 놓는 것인지...
궁금하네요. 아시는 분 계시면 알려주시기를 부탁드릴게요~
Forums:
gilgil.net
> 그렇다면 5라는 값은 메모리 상의 어디에 저장이 되는 것일까요?
static int는 global 변수와 비슷하게 작동합니다. compiler나 loader가 알아서 배치해 줍니다.
그리고 static const int는 compiler의 optimization에 의해서 상수로 번역되어 컴파일되기도 합니다.
www.gilgil.net
5가 저장된 위치의 주소값을 알아낼 수 없는 이유는 무엇일까요?
컴파일러나 로더가 5라는 값을 메모리 상에 알아서 배치해준다면, 왜 이곳의 주소를 구할 수 없는(또는 구할 수 없도록 해놓은) 것일까요? ㅠ.ㅠ
그리고 '상수로 번역되어 컴파일되기도 한다'라는 부분에 대해 더 자세한 설명을 부탁드려도 될까요? ^^
어셈 변환 결과입니다.
상기 코드에서 (1)번의 코드는 어셈블리로 다음과 같이 번역이 됩니다.
즉, N은 heap 영역(read만 되고 write는 하지 못하는)에 자리를 잡게 되지만, 실제로 사용이 될 때에는 상수(constant)와 비슷하게 컴파일하여 작동이 됩니다. 물론 이는 컴파일러(C냐 C++이냐, 벤더는 어디냐)에 따라 달라질 수 있습니다.
www.gilgil.net
a = NumTurns 와 같은 코드를 a =
a = NumTurns
와 같은 코드를
a = (int)5
와 같이 바꾸어 컴파일 해버릴 수도 있기 때문에 상수에 아예 메모리가 할당되지 않을 수도 있습니다.
댓글 달기