C++메모리 4 구역 의 코드 구역,전역 구역,창고 구역 과 더미 구역

C++메모리 4 영역
C++프로그램 이 실 행 될 때 메모 리 를 크게 코드 구역,전역 구역,창고 구역 과 더미 구역 네 구역 으로 나눈다.서로 다른 지역 에 서로 다른 데 이 터 를 저장 하고 서로 다른 생명 주 기 를 부여 하여 더욱 유연 하 게 프로 그래 밍 할 수 있다.
4.567917.코드 구역:함수 체 를 저장 하 는 바 이 너 리 코드 는 운영 체제 관리 에 의 해 만들어 지고 코드 구역 은 공유 되 며 자주 실행 되 는 프로그램 에 대해 코드 하나만 저장 하면 됩 니 다전체 영역:전체 변수 와 정적 변수 와 상수 를 저장 하고 프로그램 이 끝 난 후에 운영 체제 에서 방출 합 니 다4.567917.스 택 구역:컴 파일 에 의 해 자동 으로 방출 되 고 함수 의 매개 변수 값 과 부분 변수 등 을 저장 합 니 다
  • 쌓 기 구역:보통 프로그래머 가 new 를 통 해 공간 을 열 고 분배 와 방출 을 한다.만약 에 프로그래머 가 풀 지 않 으 면 프로그램 이 끝 날 때 운영 체제 에서 회수 된다.
  • 다음은 하나의 예 를 통 해 전역 구역,창고 구역,더미 구역 의 데이터 성명 주기 에 대해 설명 한다.
    
    //          ,         
    int g_a = 1;
    int g_b = 2;
    int main(void)
    {
     cout << "g_a     :\t"<< int(&g_a) << endl;
     cout << "g_b     :\t" << int(&g_b) << endl;
     //          ,    
     int a = 10;
     int b = 20; 
     cout << "a     :\t" << int(&a) << endl;
     cout << "b     :\t" << int(&b) << endl;
     //       ,     
     static int s_a = 40;
     static int s_b = 50;
     cout << "s_a     :\t" << int(&s_a) << endl;
     cout << "s_b     :\t" << int(&s_b) << endl;
     //          ,    
     int* d_a = new int(10);
     int* d_b = new int(20);
     cout << "d_a     :\t" << int(d_a) << endl;
     cout << "d_b     :\t" << int(d_b) << endl;
    }
    
    출력 결 과 는:
    g_a 의 주 소 는:  5300224  g_b 의 주 소 는:  5300228 
    a 의 주 소 는:    6421316  b 의 주 소 는:    6421304
    s_a 의 주 소 는:  5300232  s_b 의 주 소 는:  5300236
    d_a 의 주 소 는:  9547944  d_b 의 주 소 는:  9547992
    우 리 는 그 중에서 볼 수 있다.ga,g_b,s_a,s_b.모두 전체 구역 에 속 합 니 다.같은 이치 로 a,b 는 모두 스 택 구역 에 속 합 니 다.da,d_b.모두 퇴적 구역 에 속한다.스 택 구역 의 데 이 터 는 프로그램 실행 이 끝 난 후에 컴 파일 러 에 의 해 자동 으로 소각 되 기 때문에 국부 변수의 주 소 를 되 돌려 주지 마 십시오.예 를 들 어 다음 과 같 습 니 다.
    
    int* func()
    {
     int a = 10; //     ,            
     return &a; //     a   ,     func        
    }
    
    int main(void)
    {
     int* a = func(); //   a     func        ,           
     cout << "a     :\t" << int(a) << "a       :\t" << *a << endl;
     cout << "a     :\t" << int(a) << "a       :\t" << *a << endl;
    }
    
    
    출력 결 과 는:
    a 의 주 소 는:    7601480 a 에 저 장 된 데 이 터 는:10 입 니 다.
    a 의 주 소 는:    7601480 a 에 저 장 된 데 이 터 는 2084553696 입 니 다.
    컴 파일 러 는 스 택 의 데 이 터 를 한 번 보존 하기 때문에 첫 번 째 cout 문 구 는 정상적으로 출력 할 수 있 지만 두 번 째 출력 이 야 말로 메모리 주소 a 의 데이터 입 니 다.
    반면 블록 데 이 터 는 프로그래머 가 스스로 관리 하고 프로그램 이 실 행 된 후에 자동 으로 방출 되 지 않 는 다.전체 프로그램 이 실 행 된 후에 운영 체제 에서 방출 될 것 이다.
    
    int* func()
    {
     int * a = new int(10); //      new       ,            
     return a; //     a   ,            ,       ,       
    }
    
    int main(void)
    {
     int* a = func(); //   a     func        ,         
     cout << "a     :\t" << int(a) << "a       :\t" << *a << endl;
     cout << "a     :\t" << int(a) << "a       :\t" << *a << endl;
    }
    
    
    출력 결 과 는:
    a 의 주 소 는:    23507016a 에 저 장 된 데 이 터 는 다음 과 같 습 니 다.        10
    a 의 주 소 는:    23507016a 에 저 장 된 데 이 터 는 다음 과 같 습 니 다.        10
    첨부:메모리 4 구역 의 소결
    1.스 택 구역(stack):컴 파일 러 가 필요 할 때 분배 되 고 필요 하지 않 을 때 자동 으로 지 워 지 는 변수의 저장 구역 입 니 다.안의 변 수 는 보통 함수 의 반환 주소,파라미터,부분 변수,반환 값 등 으로 높 은 주소 에서 낮은 주소 로 증가한다.프로 세 스 에서 사용자 가상 주소 공간 상단 에 있 는 것 은 사용자 스 택 입 니 다.컴 파일 러 는 함수 호출 을 실현 합 니 다.그 조작 방식 은 데이터 구조의 창고 와 유사 하 다.
    2.쌓 기 구역(hep):일반적으로 프로그래머 가 분배 하여 방출 합 니 다.만약 에 프로그래머 가 방출 하지 않 으 면 프로그램 이 끝 날 때 OS 에서 회수 할 수 있 습 니 다.데이터 구조 에 있 는 더미 와 는 별 개의 문제 입 니 다.배분 방식 은 링크 와 유사 합 니 다.프로그램 이 실행 되 는 과정 에서 쌓 인 크기(이동 break 포인터)를 동적 으로 증가 시 키 고 낮은 주소 에서 높 은 주소 로 증가 할 수 있 습 니 다.
            더미:운영 체제 가 유지 하 는 특수 메모리 입 니 다.동적 할당 기능 을 제공 합 니 다.프로그램 이 malloc()를 호출 할 때 그 중에서 분 배 됩 니 다.나중에 free()를 호출 하면 메모 리 를 돌려 줄 수 있 습 니 다.
            자유 저장 소:자유 저장 소 는 C++에서 new 와 delete 를 통 해 대상 을 동적 으로 분배 하고 방출 하 는 추상 적 인 개념 으로 new 를 통 해 신청 하 는 메모리 영역 을 자유 저장 소 라 고 할 수 있 습 니 다.기본적으로 모든 C++컴 파일 러 는 기본적으로 더 미 를 사용 하여 자유 저장 을 실현 합 니 다.즉,결 성 된 전역 연산 자 new 와 delete 는 malloc 와 free 방식 으로 이 루어 질 수 있 습 니 다.이 때 new 연산 자 를 통 해 분 배 된 대상 은 더 미 를 쌓 는 것 도 맞 고 자유 저장 소 에서 도 정확 하 다 고 말 합 니 다.그러나 프로그래머 도 다시 불 러 오 는 조작 자 를 통 해 다른 메모리 로 자 유 롭 게 저장 할 수 있 습 니 다.예 를 들 어 전체 변수 가 만 든 대상 풀 등 이 있 습 니 다.이때 자유 저장 소 와 쌓 인 구역 은 차이 가 있 습 니 다.
    3.데이터 구역:주로 정적 전역 구역 과 정적 구역 을 포함 하고 어 셈 블 리 각도 에서 세분 화 하려 면 작은 구역 으로 나 눌 수 있 습 니 다.
            전역 영역&정적 영역:전역 변수 와 정적 변 수 는 같은 메모리 에 분 배 됩 니 다.이전 C 언어 에서 전역 변수 와 정적 변 수 는 다시
    전역 초기 화 영역(DATA 세그먼트):메모리 프로그램 에서 초기 화 된 전역 변수 와 정적 변수
    초기 화 되 지 않 은 세그먼트(BSS 세그먼트):초기 화 되 지 않 은 전역 변수 와 정적 변수(국부+전역)를 저장 합 니 다.BSS 단 은 DATA 단의 인접 한 다른 구역 에 있 습 니 다.
    BBS 세그먼트 특징:프로그램 이 실행 되 기 전에 BBS 세그먼트 가 자동 으로 제거 되 기 때문에 초기 화 되 지 않 은 전역 변수 와 정적 변 수 는 프로그램 이 실행 되 기 전에 0 이 되 었 습 니 다.
    C++에 서 는 이 구분 이 없습니다.그들 은 같은 메모리 구역 을 공동으로 사용 합 니 다.
    4.코드 구역:읽 기 전용 저장 소 와 텍스트 구역 을 포함 하 는데 그 중에서 읽 기 전용 저장 소 저장 문자열 상수,즉 상수 구역,텍스트 구역 저장 프로그램의 기계 코드 입 니 다.
    그럼'메모리 4 구역'과'메모리 5 구역'은 어떤 차이 가 있 습 니까?
    사실'메모리 4 구역'과'메모리 5 구역'이 가리 키 는 것 은 모두 똑같다.
    메모리 5 구역:스 택 구역,쌓 기 구역,전체 구역(정적 구역),항상 밝 은 구역,코드 구역
    메모리 네 구역 은 스 택 구역,쌓 기 구역,데이터 구역(전체 구역(정적 구역),항상 밝 은 구역),코드 구역 이다.
    따라서 위 에서 알 수 있 듯 이 메모리 네 개의 구역 에 있어 전체 구역(정적 구역)과 상 밝 은 구역 을 하나의 데이터 구역 으로 합 친 것 일 뿐 사실은 내용 이 똑 같 습 니 다.
    총결산
    C++메모리 4 구역 의 코드 구역,전역 구역,스 택 구역 과 더미 구역 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C+메모리 4 구역 의 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 을 바 랍 니 다!

    좋은 웹페이지 즐겨찾기