C++에서 변수선언시 동작 방법에 대한 궁굼점.

뿌직의 이미지

아주 기초적인 질문일 것 같은데요...;;

int n;
....
if( n < 1)
{
    int b;
    ....
}
....

위와 같은 코드를 컴파일(C++)해서 실행 시켜보면,
b라는 변수는 if문이 참일 때만 동적으로 생성된는 것인가요?
그러면 b라는 변수는 어디에 생성되는 것인가요?
stack? heap? 아니면 또 다른 공간?

그리고 마지막으로,
만약에 코드 중간에 선언된 변수가
동적으로 그때그때 할당되는 것이라면,

int n;
....
if( n < 1)
{
    int b;
    for( int c = 0; c < 100; c++)
    {
        int d=n;
        ....
    }
}
....

위 코드에서 변수 d는 루프문를 돌때마다 계속 생성되는 것인가요?
아니면 처음 for문 들어갈때 한번만 만들어지고
loop 돌 때는 처음에 만들어진 변수를 제사용 하는 것인가요?

hongminhee의 이미지

스택에 할당되지만, 컴파일 타임에서는 스코프가 달라서 접근할 수 없는 것입니다. 음… 아마 그럴 거예요.

다른 C++ 고수 분들이 더 잘 아실듯. 흑흑

ssehoony의 이미지

b는 if문이 참일때만 생성됩니다. 생성 위치는 스택입니다.

정확하게 말하자면, 스택은 이미 존해하고 있는 장소이기 때문에 b가 기록될 장소는 이미 마련되어있고 b = xxx 라는 코드를 지나갈때 초기화 되는 거죠.

b가 기록될 스택의 위치는 스택포인터로 부터 적당한 거리의 offset 으로 결정되며, 이 거리(offset)는 컴파일 타임 때 결정됩니다.

그럼 스택포인터는 언제 결정되느냐? 함수가 호출될때 결정됩니다.

그럼 for 안의 d는 어떻게 되느냐? for 안에서 1회 loop 할때 처음에 생겼다가 마지막에 제거되서 for 루프 횟수만큼 생성/소멸 됩니다.

하지만 이것 역시 C언어 관점이고, 컴파일된 어셈에서는 스택에 d가 생성되고, d 역시 스택포인터로 부터 적당한 offset 위치에 생성되는 것이기 때문에 d의 메모리 공간은 이미 확보되있어서 그냥 for loop 안에서 처음에 초기화 될뿐입니다. 그래서 저런 코드의 경우는 d가 for 안에 있던 밖에 있던 동일한 어셈코드가 나옵니다. 다시 말해 성능도 동일하다는 것이지요.

하지만, 클래스의 경우는 이야기가 다릅니다. 생성될 메모리는 역시 스택이므로 메모리 공간의 관점에서는 d와 차이가 없지만 클래스는 생성과 소멸시 생성자와 소멸자가 호출 되므로 for문 안에서 선언하는 것과 밖에서 선언하는 것의 성능 차이가 발생합니다. primitive type 이라고하는 C의 기본 타입인 char, int, float, double 와 같은 타입만이 선언의 위치에 상관없이 동일한 성능을 보이며, 클래스일때는 주의가 필요합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.