2010-06-21 7 views
1

실행이 C++로 시작하는 곳에서 말해주십시오. 대답이 "main"에서 이루어지기를 바랍니다.실행 시작

그러면 어떨까요?

class abc 
{ 
public: 
    abc() 
    { 
     cout<<"hello"; 
    } 
}; 

const abc obj; 

int main() 
{ 
    cout<<"Main"; 
} 

출력 :

helloMain 

정교한하시기 바랍니다.

+1

단지 컴파일 된 모든 언어에는 작성한 첫 번째 명령문보다 먼저 실행되는 코드가 있습니다. –

답변

4

귀하의 의견에서 다른 답변에 이르기까지, 10,000 피트보기가 이해를 돕는 것처럼 들립니다.

응용 프로그램 시작과 관련된 정확한 단계는 OS, 컴파일러 및 프로그래밍 언어에 따라 다르지만 "일반"프로세스는 본질적으로 동일합니다. 파일 기술자, 환경 변수 :

  1. OS 커널은
  2. 커널은 커널은 기본 프로세스를 설정하는 exectuable
  3. 를 호스팅 할 새로운 프로세스를 생성 속성을 대상 실행 파일을 실행하는 새로운 프로세스를 시작하도록 요청 , 보안 속성 등을 포함한다.
  4. 커널은 사용자 모드의 "loader"를 실행하여 실제로 실행 파일과 관련된 파일을 열고 실행할 준비를한다.
  5. 로더는 실행 파일이 들어있는 파일을 읽고 여러 가지 세그먼트 : 전역 변수 데이터 , 실행 코드 등
  6. 로더는 동적 링크 라이브러리 기호를 해결하고 실행 코드의 메모리를 적절하게 배치합니다. 기본적으로이 단계에서는 프로그램의 모든 포인터가 올바른 위치를 가리키는 지 확인합니다.
  7. 그런 다음 loder는 실행 파일의 "입력"기능을 호출합니다. 그러나 이것은 '주'기능이 아닙니다. 'entry'함수는 대개 OS/컴파일러에 의해 숨겨져 사전 기본 초기화 코드를 실행할 수 있습니다. 시작 함수 C++의 경우
  8. 은 대부분 같은 것을 볼 것이다 다음
내가 때문에, 당신은 당신이 '실행이 시작되는'가 무엇을 의미하는지에 대해 생각해야한다고 생각
int __entry(int argc, char *argv[]) 
{ 
    // configure standard I/O streams, threading tables, & other utilities 
    initialize_c_runtime(); 

    // run the constructors for all static objects 
    initialize_static_cplusplus_objects(); 

    // Now, finally, after *all* that we execute the 'main' function 
    return main(argc, argv); 
} 
+1

고마워요 :) 매우 도움이됩니다. – Sadique

12

main이 호출되기 전에 전역 변수가 만들어지고 생성자가 호출됩니다. 영업 이익의 의견에


답변 :

당신이 작성한 코드보다 깊이 파고하려는 경우, main 전에 일어나는 일이있다이있는 나 자신이 명확한 그림이없는, 호출됩니다. 우리가 작성한 코드에 대해 이야기하고 있습니다. 여기서 엔트리 포인트는 전역 변수를 초기화 한 후에 호출되는 main 함수입니다. 클래스 인스턴스의 초기화는 생성자를 호출하는 것을 의미합니다.

는 따라서 짧은에, 라인 const abc obj;가 호출되는 main 전에 (라고 인쇄 문을 그것의 기본 생성자) 초기화 유형 abc의 전역 변수를 만듭니다. 따라서 출력 helloMain

+0

@strut 업데이트를 참조하십시오 – Amarghosh

3

의 const 변수로 obj을 선언했습니다. 변수 obj은 프로그램이 컴파일러에서 생성 한 코드에 의해 실행을 시작하기 전에 기본값으로 지정됩니다. 이 코드는 기본 생성자를 호출하여 abc 유형의 기본 객체를 만들고 obj에 할당합니다.

정적 초기화를 제쳐두고두고 실행이 main()부터 시작한다고 가정하는 것이 맞습니다.

0

obj은 글로벌 개체이므로 main이 실행되기 전에 인스턴스화됩니다. 다른 전역 변수와 같습니다. 즉, 정수 변수를 전역 변수로 선언하면 가비지 값이 아닌 0이 포함됩니다. 따라서 객체가 인스턴스화되고 생성자가 호출되어 hello 문자열이 인쇄됩니다.

0

응용 프로그램이 main에서 시작하지 않습니다.

MyApp.exe의 wmain (INT는 argc = 0x00000001, wchar_t를 * * 변수는 argv = 0x00364d68) 라인! VS2005로 컴파일 (콘솔 응용 프로그램, 유니 코드 버전) 주요의 시작부터 약간의 스택 스냅 샷은 다음과 67 C++

myapp.exe!__tmainCRTStartup() Line 594 + 0x17 bytes  

[email protected]() + 0x23 bytes  

사용자 모드에서 새로운 프로세스 컨텍스트에서 실행하는 것을 할 수있는 첫 번째 함수는 Win32 레벨 함수이다 BaseProcessStart이다. 바이너리 이미지 자체의 다양한 데이터 섹션을 사용하여 다양한 초기화 프로그램 (예 : obj 같은 글로벌 생성자)을 실행하는 CRT 수준의 mainCRTStartup을 호출합니다. 사실, 여러분은 여러분의 ctor에 중단 점을 설정하고 직접 볼 수 있습니다 :

myapp.EXE! '동적 초기화 for'obj' '()

msvcr80.dll! _initterm (...)

MyApp.exe의! __ tmainCRTStartup()

[email protected]()

(일부 서식 지정에 어려움이 있음) initterm은 전역 개체를 반복하고 해당 생성자를 호출하는 함수입니다.

스택은 다른 플랫폼과 컴파일러 (그리고 심지어 VS에서는 MFC 앱과 매우 다름)에서 다르게 보일 수 있지만 아이디어는 항상 동일합니다. 런타임은 이진 이미지 정보를 사용하여 전역 객체를 초기화합니다 전에 자신의 main이 입력됩니다.

+0

VC++을 비표준 모드 ('wmain() ')로 표시하고 있습니다 만, 이것은 완전히 유효하지는 않습니다 만, 전역에 대해 ctors를 호출하는 동일한 숨겨진 함수는 엔트리 포인트 – MSalters

+0

나는 그것이 유니 코드 버전이라는 것을 명시 적으로 언급합니다. 당신이 Shilon 씨에게 말한 것 !! 나는 당신의 설명에 대해 단서가 없다 !! –

+0

이것이 문제입니다! 이제 내가 정말로 어떤 단서를 가지고 있다고 생각합니까? (예 : int main (int argc, char ** argv)) – Sadique

관련 문제