문제

나는 확실히 자부하는 전 세계적으로 선언한 변수를 할당(와 초기화,해당되는 경우)프로그램에서 시작 시간입니다.

int globalgarbage;
unsigned int anumber = 42;

하지만 무엇에 대해 정적들 내에서 정의된 기능이?

void doSomething()
{
  static bool globalish = true;
  // ...
}

때 공간 globalish 할당?내 프로그램을 시작합니다.하지만 그것을 얻을 초기화한 다음까?또는 초기화면 doSomething() 이 처음이라는?

도움이 되었습니까?

해결책

었에 대한 호기심이이 그래서 내가 쓴 다음과 같은 테스트 프로그램 컴파일하 g++버전 4.1.2.

include <iostream>
#include <string>

using namespace std;

class test
{
public:
        test(const char *name)
                : _name(name)
        {
                cout << _name << " created" << endl;
        }

        ~test()
        {
                cout << _name << " destroyed" << endl;
        }

        string _name;
};

test t("global variable");

void f()
{
        static test t("static variable");

        test t2("Local variable");

        cout << "Function executed" << endl;
}


int main()
{
        test t("local to main");

        cout << "Program start" << endl;

        f();

        cout << "Program end" << endl;
        return 0;
}

결과가 없습니다.생성자를 위해 정적 객체를 호출하지 않을 때까지 첫 번째 시간 함수가 호출됩니다.출력은 다음과 같습니다.

global variable created
local to main created
Program start
static variable created
Local variable created
Function executed
Local variable destroyed
Program end
local to main destroyed
static variable destroyed
global variable destroyed

다른 팁

일부는 관련 장황에서는 C++표준:

3.6.2 의 초기화가 아닌 지역 개체[기본입니다.시작합니다.init]

1

저장소에 대한 물체를 정적 스토리지 기간(basic.stc.static 다)를 둔 제로 초기화된(dcl.init) 하기 전에 다른 모든 초기화를 수행하는 장소입니다.체의 POD 유형(basic.유형 이)정적 저장 기간 으로 초기화된 일정한 표정(expr.const)야 하기 전에 초기화 모든 초기화를 수행하는 동적 장소입니다.체의 네임스페이스의 범위와 함께 정관에서 정한 기간 같은 번역 유닛과 동적으로 초기화된 것 초기화되는 순서대로의 정의에 나타납니다 번역 단위입니다.[참고: dcl.init.aggr 설명 기 위해서는 집계 멤버 초기화됩니다.이 초기화 현지의 정체에서 설명 stmt.dcl. ]

[이상의 텍스트 아래에 더 추가 자유를 위한 컴파일러 작가들]

6.7 선언 문[stmt.dcl]

...

4

로 초기화(dcl.init)의 모든 로컬체 정적 저장 기간(basic.stc.static 는)기 전에 수행됩 다른 모든 초기화를 수행하는 장소입니다.로컬의 목 POD 형식(basic.유형 이)정적 저장 기간 으로 초기화된 일정한 표정을 초기화 전에 블록이 첫 번째 입력합니다.구현을 수행할 수 초기 초기화의 다른 지역 개체와 정적 스토리지 지속 동일한 조건 하에서는 구현하는 이 허용하는 정적으로 초기화를 객체로 정적 스토리지 편에서 네임스페이스 범위(basic.시작합니다.init).그렇지 않으면 이러 체가 초기화되는 첫 시간을 제어를 통해 전달 그 는 선언;이러한 객체화합니다.에 료의 초기 설정입니다.면 초기화 종료해 예외를 발생하고,초기화되지 않은 완벽한 것입니다 그래서 다 다시 시도했는 다음 시간 제어 들어가는 선언입니다.는 경우 제어 다시 입력한 선언(반복)하는 동안 객체가 되는 초기화,동작이 정의 되지 않습니다.[예제:

      int foo(int i)
      {
          static int s = foo(2*i);  // recursive call - undefined
          return i+1;
      }

--예제]

5

의 소멸에 대한 지역 개체와 정체되 저장 기간 것입니다 실행하는 경우에만 변수에 건설되었다.[참고: basic.시작합니다.기 에 대해 설명합하는 순서 지역 체와 정체되 저장 기간은 파괴되었다.]

메모리에 대한 모든 정적 변수를 할당에서 프로그램 load.그러나 지역 정적 변수를 만든 초기화하는 첫번째로 그들을 사용하지 않 프로그램을 시작합니다.거기에 몇 가지 좋은 읽기에 대해,그리고 정적에서 일반적으로, .에서 일반적인 내가 생각하는 몇 가지의 이러한 문제에 따라 구현,특히 알고 싶다면 어디 메모리에 이 재료를 할 수 있습니다.

컴파일러를 할당할 것이 static variable(s)함수에서 정의 foo 프로그램을 로드하는,그러나 컴파일러 또한 추가 지침(컴퓨터 코드)을 기능 foo 그래서 처음 호출이 추가 코드를 초기화한다는 정적 변수(예를들면를 호출하여 생성자,해당되는 경우).

@Adam:이 뒤에 주입하여 코드를 컴파일러는 이유에 대한 결과를 보았습니다.

내가 하려고 다시 테스트에서 코드 Adam 찌르기 고 추가되는 두 개의 더 많은 경우:static variable in class POD 유형입니다.내 컴파일러입니다 g++4.8.1,Windows OS(MinGW-32).결과는 정적 변수 클래스에서는 대우와 동일한 글로벌 변수입니다.그것의 생성자를 호출됩니다에 들어가기 전에 주요 기능입니다.

  • 결론(g++,Windows 환경):

    1. 글로벌 변수정원에서 클래스:생성자를 호출하기 전에 입력 메인 기능 (1).
    2. 지역 변수:생성자를 호출만을 때 실행에 도달하면 그 선언에서 첫 시간입니다.
    3. 는 경우 지역 정적 변수의 포드형,그것은 또한 초기화 전에 입력 메인 기능 (1).에 대한 예 POD 유형: static int number=10;

(1):정확한 상태이어야 한다: "전에 모든 기능에서 같은 번역 유닛은". 그러나,대한 기능을 제공하면서 응용 프로그램에서는 아래 예,다음 메인 기능입니다.

함 < 마스터는 모든>

#include < string>

using namespace std;

class test
{
public:
   test(const char *name)
            : _name(name)
    {
            cout << _name << " created" << endl;
    }

    ~test()
    {
            cout << _name << " destroyed" << endl;
    }

    string _name;
    static test t; // static member
 };
test test::t("static in class");

test t("global variable");

void f()
{
    static  test t("static variable");
    static int num = 10 ; // POD type, init before enter main function

    test t2("Local variable");
    cout << "Function executed" << endl;
}

int main()
{
    test t("local to main");
    cout << "Program start" << endl;
    f();
    cout << "Program end" << endl;
    return 0;
 }

결과:

static in class created
global variable created
local to main created
Program start
static variable created
Local variable created
Function executed
Local variable destroyed
Program end
local to main destroyed
static variable destroyed
global variable destroyed
static in class destroyed

누군가 테스트에서 리눅스 env?

정적 변수를 할당 내부에는 코드는 세그먼트-그들은 실행 파일의 이미지,그래서 매핑에서 이미 초기화됩니다.

정적 내에 있는 변수 범위 기능은 동일하게 취급,범위는 순전히는 수준 언어를 구성.

이러한 이유로 당신은 정적 변수 초기화됩 0(을 지정하지 않으면 뭔가 다른 사람)보다는 오히려 정의되지 않은 값입니다.

거기에 몇 가지 다른 측면 초기화를 활용할 수 있습니다 off--예를 들어 공용 세그먼트를 허용한 다른 인스턴스는 실행 파일의 실행을 한 번에 액세스하는 동일한 정적 변수입니다.

에서는 C++(전 세계적으로 범위의)정적 객체의 생성자를 호출 프로그램의 일부분으로 시작,의 제어에서 C 런타임 라이브러리입니다.Visual C++적어도 순서는 개체는 초기화에 의해 제어 할 수 있습니다 init_seg pragma.

또는 초기화면 작업()의 첫 번째라는?

네,그렇습니다.이 다른 것들 사이에,당신 초기화를 전 세계적으로 액세스하는 데이터 구조는 적절한 경우,예를 들어 내려고/을 잡니다.E.g.대

int foo = init(); // bad if init() throws something

int main() {
  try {
    ...
  }
  catch(...){
    ...
  }
}

할 수 있습 쓰

int& foo() {
  static int myfoo = init();
  return myfoo;
}

과 사용 내부 try/하고 있습니다.에 첫 번째 호출,변수 초기화됩니다.그런 다음에 다음을 호출,그것의 값이 반환됩니다(참조).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top