클래스 멤버로 선언된 상수의 초기값이 저장되는 메모리 위치는?

thnkdiff의 이미지

요즘 Effective C++ 책을 보고 있는데요, 거기 아래와 같은 코드가 나옵니다.

class GamePlayer {
private:
  static const int NumTurns = 5;
  int scores[NumTurns];
  ...
};

여기에서 NumTurns는 '정의'가 아니라 '선언'된 것이구요,
이 상수의 주소값을 구하지 않는 한, 이렇게 정의 없이 선언만 해도 문제가 없다고 나옵니다.
만약 어딘가에 이 상수의 주소값을 구하는 코드를 쓰게 되면, 구현 파일에 아래와 같이 상수의 정의를 해야한다고 합니다.

const int GamePlayer::NumTurns;

여기에서 궁금한 것이 생겼습니다.
상수가 '정의' 없이 '선언'만 되었다면 이 상수를 위한 공간이 메모리 상에 생기지 않았을텐데요,
(그래서 아마도 이 상수의 주소값을 구하지 못하는 것일 테구요)
그렇다면 5라는 값은 메모리 상의 어디에 저장이 되는 것일까요?

주소값을 구하는 코드가 없다면, '정의' 없이 '선언'만 하고도 GamePlayer 클래스의 멤버함수들 내에서는
NumTurns 상수에 접근해서 5라는 값을 사용할 텐데요, 그렇게 하려면 5라는 값이 메모리 어딘가에는 저장되어 있어야 할 것 같은데
아직 정의가 안 된 상수이니 메모리 어디에 5라는 값을 저장해 놓는 것인지...

궁금하네요. 아시는 분 계시면 알려주시기를 부탁드릴게요~

gilgil의 이미지

> 그렇다면 5라는 값은 메모리 상의 어디에 저장이 되는 것일까요?
static int는 global 변수와 비슷하게 작동합니다. compiler나 loader가 알아서 배치해 줍니다.

그리고 static const int는 compiler의 optimization에 의해서 상수로 번역되어 컴파일되기도 합니다.

thnkdiff의 이미지

컴파일러나 로더가 5라는 값을 메모리 상에 알아서 배치해준다면, 왜 이곳의 주소를 구할 수 없는(또는 구할 수 없도록 해놓은) 것일까요? ㅠ.ㅠ

그리고 '상수로 번역되어 컴파일되기도 한다'라는 부분에 대해 더 자세한 설명을 부탁드려도 될까요? ^^

gilgil의 이미지

#include <stdio.h>
 
static const int N = 5;
 
int main()
{
  int i = N; // (1)
  printf("%d\n", i);
}

상기 코드에서 (1)번의 코드는 어셈블리로 다음과 같이 번역이 됩니다.

mov         dword ptr [i],5

즉, N은 heap 영역(read만 되고 write는 하지 못하는)에 자리를 잡게 되지만, 실제로 사용이 될 때에는 상수(constant)와 비슷하게 컴파일하여 작동이 됩니다. 물론 이는 컴파일러(C냐 C++이냐, 벤더는 어디냐)에 따라 달라질 수 있습니다.

ifree의 이미지

a = NumTurns

와 같은 코드를

a = (int)5

와 같이 바꾸어 컴파일 해버릴 수도 있기 때문에 상수에 아예 메모리가 할당되지 않을 수도 있습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.