2009-06-06 2 views
2

컴파일하는 동안 메모리가 할당되는시기는 언제입니까?

를 쓸 때
int main() 
{ 
    int j; 
} 

컴파일 할 때 'j'의 메모리가 할당되지만 컴파일 할 때는 언제입니까? 변수가 메모리에 할당 될 때 컴파일의 다양한 단계는 무엇입니까? j가 전 세계라면?

+1

질문의 형식을 지정하십시오. 두 줄의 공백이 생깁니다. –

+1

여하튼 나는 당신의 질문이 애매하고 당신의 질문 이름과 묘사가 일치하지 않는다고 느낍니다. –

+0

C에서 다른 범위의 메모리 할당에 관한 질문 인 경우 제목을 편집하여 일치시켜야합니다. – Doug

답변

5

컴파일 할 때 애플리케이션이 시작될 때 응용 프로그램이 main() 범위를 입력 할 때 할당됩니다 (실제로 스택이 사용됨에 따라 기술적으로 할당되지 않음). main() 범위에 들어가기 전에 런타임에 할당하십시오.

+0

이 답변은 올바르지 않습니다 : 'j'에 대한 저장소는 응용 프로그램 시작시 할당되지 않습니다. (프로세스 시작과 'main'입력 사이에 일반적으로 1000s의 지침이 있습니다.) 그리고 전역 변수 *는 프로세스 시작시 할당되고, * main보다 먼저 * long * 할당됩니다. –

+0

응용 프로그램 시작의 main() 부분을 입력하는 것이 좋습니다. '그냥'을 삭제했습니다. –

0

j를 어디에 둘 것인지 컴파일러가 결정합니다. 일반적으로 지역 변수는 스택에 배치되며 특정 예제에서와 같이 컴파일러는 main 함수의 지속 기간 동안 스택에 공간을 예약합니다. 이것은 자신의 메모리를 가질 수있는 전역 변수 메모리와 다릅니다.

8

나는 당신이 물건을 혼합하는 것 같아요.

컴파일러는 변수에 메모리를 할당하지 않습니다. 런타임시 변수에 메모리를 할당하는 코드를 생성합니다. 전역에 대해서는 프로그램 시작 코드에 추가됩니다.

2

컴파일 프로세스가 메모리를 할당하지 않습니다. 메모리를 할당하는 코드를 생성합니다.

이 경우 j은 스택 변수가 될 것이고 실행이 main() 함수에 들어갈 때 할당됩니다. 글로벌 변수와 정적 변수가 대신 힙에 할당됩니다.

간략한 설명은 http://www.costech.or.tz/cs231/websites/C%20Programming/www-ee.eng.hawaii.edu/Courses/ee150/Book/chap14/subsection2.1.1.8.html입니다. 내가 더 나은 것을 찾을 수 있는지 알게 될 것이다.

+0

첫 문장에 'not'가 누락 되었습니까? –

+0

예, 죄송합니다. – Thorarin

+0

이제 답변이 정확합니다. 전역 변수와 정적 변수는 힙에 할당되지 않습니다. 프로세스 시작시 프로그램 로더에 의해 메모리 맵핑됩니다. 그런 간단한 질문이 많은 잘못된 답변을 생성한다는 것이 아이러니하다고 생각합니다. 아마도이 질문을 면접 질문으로 사용해야합니다. –

2

컴파일은 프로그램의 실행 코드를 생성합니다. 프로그램 메모리는 해당 실행 코드가 실행될 때 할당됩니다.

+0

"프로그램 메모리"보다는 "데이터 메모리"라고하는 것이 더 좋습니까? –

0

메모리는 컴파일 할 때 할당되지 않지만 런타임에 할당됩니다. 컴파일러가 프로그램을 실행할 기계어 코드를 생성했지만 실제 할당은 런타임에 발생합니다. 이 경우 변수는 사용되지 않으며 코드가 생성되지 않습니다.

0

나는 'j'의 메모리 할당보다는 컴파일의 단계를보고 있다고 생각한다. 그렇게 생각하기 때문에 다음과 같은 일이 발생합니다 :

일단 소스 코드를 C 컴파일러에 제공하면 첫 번째 단계는 구문과 소스 코드의 의미가 어휘 및 의미 분석 인 것입니다. 정확성을 분석했다. 오류가 발견되면 컴파일러는 그에 따라보고하고 진행하지 않습니다. 오류가 발견되지 않으면 일반적으로 다양한 최적화를 거친 후 소스 코드의 중간 표현을 생성합니다. 이 중간 표현은 모국어 (C와 같은 OS/아키텍처 고유) 또는 플랫폼 독립적 인 바이트 코드 (Python/Java .. 등) 일 수 있습니다. 컴파일러의 기능은 여기서 끝납니다.

코드를 실행하면 메모리 할당은 발생합니다. 프로그램의 런타임입니다. 이것은 컴파일 단계 이후에만 나오며 아마도 여기에서 알고 싶지 않을 것입니다. 원한다면 알려주세요. 내가 아는대로 추가하려고 노력할 것이다.

HTH.

5

C에서 main은 다른 모든 함수와 동일하게 컴파일됩니다. main에 선언 된 변수는 스택에 "할당"됩니다. 스택 프레임은 단일 함수 호출에 의해 사용되는 스택 부분입니다. 프레임에는 함수 내에서 사용되는 모든 지역에 대한 슬롯이 들어 있습니다. 이 메모리는 함수가 반환 될 때부터 임시로 간주됩니다.이 프레임은 스택에서 팝됩니다.

C 컴파일러는 전역 변수에 정적 주소를 할당합니다. 이 주소는 바이너리의 "이미지"의 일부로 간주되며 메모리에 정적 위치가 있습니다. C 컴파일러는 모든 유형의 크기를 알고 있으므로 각 전역 변수에 대한 바이너리의 메모리 레이아웃에 적절한 양의 공간을 따로 설정할 수 있습니다. 그런 다음이 변수에 액세스하는 코드는이 주소를 대신 참조합니다.

당신은 같은 코드로 변수의 주소를 검사 할 수 있습니다

:

    : 여기서주의해야 두 가지가 있습니다

    ./a.out 
    &i = 600934d 
    From foo &n = 38bc4efcd 
    From foo &i = 600934d 
    From foo &n = 38bc4eccd 
    From foo &i = 600934d 
    From foo &n = 38bc4e9cd 
    From foo &i = 600934d 
    

    :이 코드를 실행

    #include<stdio.h> 
    
    int i; 
    
    void foo(int n) 
    { 
        if(n > 2) 
         return; 
    
        printf("From foo &n = %xd\n", &n); 
        printf("From foo &i = %xd\n", &i); 
    
        foo(n+1); 
    } 
    
    
    int main() 
    { 
        printf("&i = %xd\n", &i); 
        foo(0); 
        return 0; 
    } 
    

    과 유사한 출력을 생성합니다

  1. i의 주소는 참조 될 때마다 일정합니다.
  2. n의 주소 (foo를 호출 할 때마다 foo 변수의 로컬 변수가 변경됩니다. 사실, 스택이 아래쪽으로 커지므로 매번 감소 할 것입니다.
관련 문제