static 변수에 대해..

sore의 이미지

static이란 건 말그대로 변수를 선언할 때 메모리를 정적으로 할당하여 변하지 않게 하는 것으로 알고있습니다.

static int a;
라 선언해서 a라는 변수가 0x000010 번지에 잡히면
다음에 또 a라는 것을 쓸 대에도 항상 10 번지에 쓰고 지우고 하게끔...

그렇다면 전역 변수와의 차이는 뭔가요?
전역변수도 마찬가지로 프로그램 내에서 하나밖에 없는 변수명으로 선언을 해주어야 하는 것일텐데...

실질적으로 쓰임새의 차이라던가.. 그런건 어떻게 알 수 있는 것인지...

궁금합니다...

세벌의 이미지

int main()
{
  testfunc();
  testfunc();

  testfunc2();
  testfunc2();

  return 0;
}

void testfunc()
{
  int a=3;
  a++;
  printf("%d\n", a);
}

void testfunc2()
{
  static int a=3;
  a++;
  printf("%d\n", a);
}

컴파일 실행 해 보시면 차이를 알 겁니다. 바로 만든 거라 함수 이름은 별로 안 예쁘군요 -.-

전역변수와의 차이는 static 변수는 그 함수 밖에서는 쓸 수 없다는 거죠.

서지훈의 이미지

전역 변수는 기본적으로 암시적 extern 선언입니다.
그리고 global variable 은 소스내에서 어디서든지 불러서 사용을 할 수가 있습니다. scope가 무한대라 할 수가 있겠죠... 그안에선...
그리고 extern 선언이기 때문에 외부(다른 소스파일)의 것인 경우도 사용이 가능합니다.
이렇게 많은 차이가...-_-ㅋ

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

추신_겉으론 같아 보이지만... 자세히 알고 보면 다르죠...
사람과 같이...-_-ㅋ

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

pynoos의 이미지

설명을 보충하면,

gcc의 구현은...

함수내 static과 전역변수는 process와 동일한 생명시간을 갖습니다.
함수내 static은 naming 충돌을 위해서 간단한 name mangling이 들어 갑니다.
static 은 local symbol 형태로 만들어 집니다.

nm 을 사용해서 .o 파일의 name mangling과 export 여부를 확인해보세요.

hanseok의 이미지

pynoos wrote:
함수내 static은 naming 충돌을 위해서 간단한 name mangling이 들어 갑니다.
static 은 local symbol 형태로 만들어 집니다.

nm 을 사용해서 .o 파일의 name mangling과 export 여부를 확인해보세요.

이런 내용은 컴파일러 책에서 나오는 내용인가요?

아니면 다른 책에서..

혼자 습득하신건가요?

웅.. 깊이 이는 지식을 가지고 싶은ㄷ..

잠이 들어야지만 꿈을 꿀수 있는것인가?
우리는 항상 꿈을 쫓아 가며 살아가는 사람들..

pynoos의 이미지

hanseok wrote:
pynoos wrote:
함수내 static은 naming 충돌을 위해서 간단한 name mangling이 들어 갑니다.
static 은 local symbol 형태로 만들어 집니다.

nm 을 사용해서 .o 파일의 name mangling과 export 여부를 확인해보세요.

이런 내용은 컴파일러 책에서 나오는 내용인가요?

아니면 다른 책에서..

혼자 습득하신건가요?

웅.. 깊이 이는 지식을 가지고 싶은ㄷ..

가끔 좋은 툴은 좋은 지식을 만들기도 합니다. :roll:
전 하나의 툴을 보면 그 툴의 모든 옵션을 이해하려고 하는 이상한 습관이 있어서.. 그러다 보니 알게 되더군요..

좋은 툴이라기보다는 좋은 옵션이겠군요. :)

댓글 달기

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