c 언어 stack(스 택)과 힙(더미)의 사용 에 대한 상세 한 설명

1.예비 지식-프로그램의 메모리 배분
C/C++컴 파일 된 프로그램 이 사용 하 는 메모 리 는 다음 과 같은 몇 부분 으로 나 뉜 다.
1.스 택 구역(stack)-컴 파일 러 에 의 해 자동 으로 분배 되 고 함수 의 매개 변수 값,부분 변수의 값 등 을 저장 합 니 다.그 조작 방식 은 데이터 구조의 창고 와 유사 하 다.2.쌓 기 구역(hep)-일반적으로 프로그래머 가 배정 하여 방출 합 니 다.프로그래머 가 풀 지 않 으 면 프로그램 이 끝 날 때 OS 에서 회수 할 수 있 습 니 다.이 는 데이터 구조 중의 더미 와 는 별 개의 일이 고 분배 방식 은 오히려 링크 와 유사 하 다 는 것 을 주의 하 세 요.3.전역 구역(정적 구역)(static)-전역 변수 와 정적 변수의 저장 소 는 한 곳 에 놓 여 있 습 니 다.초기 화 된 전역 변수 와 정적 변 수 는 한 지역 에 있 고 초기 화 되 지 않 은 전역 변수 와 초기 화 되 지 않 은 정적 변 수 는 인접 한 다른 지역 에 있 습 니 다.프로그램 이 끝 난 후 시스템 에서 방출 됩 니 다.4.문자 상수 구역-상수 문자열 은 바로 여기에 놓 여 있 습 니 다.프로그램 이 끝 난 후 시스템 에서 방출 됩 니 다.5.프로그램 코드 구역-함수 체 를 저장 하 는 바 이 너 리 코드.
2.예 절차

//main.cpp
 int a=0;  //
 char *p1;  //
 main()
 {
  intb;
  char s[]="abc";  //
  char *p2;     //
  char *p3="123456";  //123456\0 ,p3 。
  static int c=0;  // ( )
  p1 = (char*)malloc(10);
  p2 = (char*)malloc(20);  // 10 20 。
  strcpy(p1,"123456");  //123456\0 , p3 "123456" 。
}
3.쌓 기와 창고 의 이론 지식 2.1 신청 방식 stack:시스템 에서 자동 으로 분배 합 니 다.예 를 들 어 함수 에 있 는 부분 변수 int b 를 설명 합 니 다.시스템 은 자동 으로 스 택 에서 b 에 공간 을 엽 니 다.
heap: 프로그래머 가 직접 신청 하고 크기 를 가리 키 며 c 에서 p1=(char*)malloc(10)와 같은 malloc 함 수 를 사용 해 야 합 니 다.C++에서 p2=(char*)malloc(10)와 같은 new 연산 자 를 사용 합 니 다.하지만 p1,p2 자체 가 스 택 에 있 습 니 다.
2.2 신청 후 시스템 응답 스 택:스 택 의 남 은 공간 이 신청 한 공간 보다 크 면 시스템 은 프로그램 에 메모 리 를 제공 합 니 다.그렇지 않 으 면 이상 알림 스 택 이 넘 칠 것 입 니 다.더미:먼저 운영 체제 에 남 은 메모리 주 소 를 기록 하 는 링크 가 있다 는 것 을 알 아야 한다.시스템 이 프로그램의 신청 을 받 았 을 때 이 링크 를 옮 겨 다 니 며 신청 한 공간 보다 큰 첫 번 째 공간 을 찾 은 다음 에 이 노드 를 남 은 노드 링크 에서 삭제 하고 이 노드 의 공간 을 프로그램 에 배정 해 야 한다.또한 대부분의 시스템 에 대해이 메모리 공간의 첫 번 째 주소 에 이번 할당 의 크기 를 기록 합 니 다.그래 야 코드 의 delete 문 구 는 이 메모리 공간 을 정확하게 방출 할 수 있 습 니 다.또한,찾 은 퇴적 점 의 크기 가 반드시 신청 의 크기 와 같 지 않 기 때문에 시스템 은 자동 으로 남 은 부분 을 남 은 링크 에 다시 넣 습 니 다.
2.3 신청 크기 의 제한 스 택:Windows 에서 스 택 은 낮은 주소 로 확 장 된 데이터 구조 로 연속 적 인 메모리 구역 입 니 다.이 말 은 스 택 꼭대기 의 주소 와 스 택 의 최대 용량 은 시스템 이 미리 정 해 놓 은 것 이 고,WINDOWS 에서 스 택 의 크기 는 2M(1M 라 고도 하 는데,한 번 컴 파일 할 때 정 해진 상수)이 며,신청 한 공간 이 스 택 의 남 은 공간 을 초과 할 경우 overflow 를 알려 준 다 는 뜻 이다.따라서 스 택 에서 얻 을 수 있 는 공간 이 적다.더미:더 미 는 높 은 주소 로 확 장 된 데이터 구조 로 불 연속 메모리 영역 입 니 다.이것 은 시스템 이 남 은 메모리 주 소 를 링크 로 저장 하기 때문에 자 연 스 럽 게 연속 되 지 않 고 링크 의 이동 방향 은 낮은 주소 에서 높 은 주소 로 이동 합 니 다.쌓 인 크기 는 컴퓨터 시스템 의 효과 적 인 가상 메모리 에 제한 을 받는다.이 를 통 해 알 수 있 듯 이 쌓 아 올 린 공간 이 비교적 유연 하고 크다.
2.4 신청 효율 의 비교:창고:시스템 에서 자동 으로 분배 되 고 속도 가 비교적 빠르다.하지만 프로그래머 는 통제 할 수 없다.더미:new 에서 분 배 된 메모리 입 니 다.보통 속도 가 느 리 고 메모리 조각 이 생기 기 쉬 우 나 사용 하기에 가장 편리 합 니 다.또한,WINDOWS 에서 가장 좋 은 방법 은 Virtual Alloc 로 메모 리 를 분배 하 는 것 입 니 다.그 는 쌓 거나 스 택 에 있 는 것 이 아니 라 프로 세 스 의 주소 공간 에 메모 리 를 직접 보관 하 는 것 입 니 다.사용 하기에 가장 불편 하지만.하지만 속도 가 빠 르 고 유연 하 다.
2.5 더미 와 스 택 에 저 장 된 콘 텐 츠 스 택:함수 호출 시 첫 번 째 로 스 택 에 들 어간 것 은 주 함수 의 다음 명령(함수 호출 문장의 다음 실행 가능 한 문장)의 주소 이 고 그 다음 에 함수 의 각 매개 변수 입 니 다.대부분의 C 컴 파일 러 에서 매개 변 수 는 오른쪽 에서 왼쪽으로 스 택 에 들 어간 다음 에 함수 중의 부분 변수 입 니 다.정적 변 수 는 스 택 에 들 어가 지 않 습 니 다.이번 함수 호출 이 끝 난 후에 부분 변 수 는 먼저 스 택 에서 나 온 다음 에 매개 변수 입 니 다.마지막 으로 스 택 상단 지침 은 처음에 저 장 된 주 소 를 가리 키 고 있 습 니 다.즉,주 함수 중의 다음 명령 입 니 다.프로그램 은 이 점 에서 계속 실 행 됩 니 다.더미:보통 쌓 인 머리 에 바이트 로 쌓 인 크기 입 니 다.더미 속 의 구체 적 인 내용 은 프로그래머 가 안배 한다.
2.6 액세스 효율 의 비교

char s1[]="aaaaaaaaaaaaaaa";
char *s2="bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa ; bbbbbbbbbbb ; , , ( ) 。 :
#include
int main()
{
char a=1;
char c[]="1234567890";
char *p="1234567890";
a = c[1];
a = p[1];
return 1;
}
대응 하 는 어 셈 블 리 코드

10:a=c[1];
004010678A4DF1movcl,byteptr[ebp-0Fh]
0040106A884DFCmovbyteptr[ebp-4],cl
11:a=p[1];
0040106D8B55ECmovedx,dwordptr[ebp-14h]
004010708A4201moval,byteptr[edx+1]
004010738845FCmovbyteptr[ebp-4],al
첫 번 째 는 읽 을 때 문자열 의 요 소 를 레지스터 cl 에 직접 읽 고 두 번 째 는 포인터 값 을 ex 에 읽 어야 합 니 다.ex 에 따라 문 자 를 읽 으 면 느 립 니 다.2.7 잔 과 잔 의 차 이 는 다음 과 같은 비유 로 알 수 있다.잔 을 사용 하 는 것 은 우리 가 식당 에 가서 밥 을 먹 는 것 과 같이 주문(신청),돈 지불,먹 기(사용)만 하고 배 부 르 면 간다.채 소 를 썰 거나 채 소 를 씻 는 등 준비 작업 과 설거지,솥 을 씻 는 등 마무리 작업 에 신경 쓰 지 않 아 도 된다.그의 장점 은 빠 르 지만 자유도 가 적다.더 미 를 사용 하 는 것 은 자신 이 좋아 하 는 요 리 를 만 드 는 것 처럼 번 거 롭 지만 자신의 입맛 에 맞 고 자유도 가 높다.

좋은 웹페이지 즐겨찾기