programing

변수 쌓기 대힙 변수

subpage 2023. 6. 18. 16:00
반응형

변수 쌓기 대힙 변수

다음과 같이 생각하는 것이 옳습니까?

char *buff[500];

스택 변수를 생성하며, 다음을 수행합니다.

char *buff = (char *)malloc(500);

힙 변수를 생성하시겠습니까?

스택 변수에 힙 변수를 사용하거나 스택 변수에 힙 변수를 사용하는 경우와 그 반대의 경우도 마찬가지입니다.스택이 더 빠른 것으로 알고 있습니다. 다른 것도 있습니다.

마지막 질문은 주 기능이 스택의 스택 프레임인가요?

. 예 먼 스 에 char pointer 배 만 다 니 택 듭 을 열 저 ▁pointer ▁char ▁yes 다 니500*4 bytes두 번째는 힙에 500자를 할당하고 스택 차트를 지정합니다.

스택에서 할당하는 것은 쉽고 빠르지만 스택이 제한적이며 힙은 느리지만 훨씬 큽니다.이와 별도로 스택 할당 값은 스코프를 벗어나면 "삭제"되므로 원시 변수와 같은 작은 로컬 값에 매우 적합합니다.

이 다 수 .main실행하는 모든 함수에는 스택 프레임이 있고 함수에 대한 모든 로컬 변수가 저장되므로 함수 호출에 너무 깊이 들어가면 스택 오버플로가 발생할 수 있습니다.

일반적으로 자주 사용하고 힙에서 100바이트보다 큰 모든 항목과 스택에서 작은 변수 및 포인터를 할당하는 것이 좋습니다.

당신이 쓴 글을 보니

char *buff = (char *)malloc(500);

당신 말은 아마도

char buff[500];    instead of 
char* buff[500];

첫 번째 예제에서는 (따라서 char에 대한 포인터 배열이 아닌 char 배열이 있습니다)

예, ESP 레지스터에 저장된 포인터를 늘리기만 하면 되므로 스택의 "할당"이 더 빠릅니다.

다음과 같은 경우 힙 변수가 필요합니다.

스택에 적합한 메모리보다 많은 메모리(이전 버전)

호출된 함수에 의해 호출 함수에 할당된 메모리를 호출 함수에 할당합니다.

당신의.buffs는 동등하지 않습니다.

번째것 (번째첫▁(번째▁the첫▁(▁first)char *buff[500]된 배열입니다; 두 ()는 500개의 포인터입니다.char *buff = (char *)malloc(500)는입니다.는 포인터입니다.

포인터(스택의)는 힙에서 500바이트의 메모리(malloc 호출이 성공한 경우)를 가리킵니다.
포인터 배열이 스택에 있습니다.포인터가 초기화되지 않았습니다.

C99를 사용하지 않는 한, 스택을 사용하는 것은 컴파일 시에 어레이의 크기를 알아야 합니다.즉, 다음 작업을 수행할 수 없습니다.

int size = 3; // somewhere, possibly from user input
char *buff[size];

그러나 "히프"(동적 할당)를 사용하면 원하는 모든 차원을 제공할 수 있습니다.메모리 할당이 실행 파일에 하드 코딩되지 않고 런타임에 수행되기 때문입니다.

C 표준에는 이나 스택이라는 단어포함되어 있지 않습니다.대신 두 가지 스토리지 기간(총 4개)이 있습니다. 즉, 자동 및 할당됩니다.

  • char buff[500]; // note the missing * to match the malloc example
    

    함수 내에서 개체를 선언합니다.buff의 서배로로서.char자동 저장 기간이 있습니다.개체가 선언된 블록이 종료되면 개체가 중지됩니다.

  • char *buff = malloc(500);  // no cast necessary; this is C
    

    을 선언할 것입니다.buff의 단서로서.char.malloc에서는 500개의 연속 바이트를 예약하고 포인터를 반환합니다.으로 "500바이트 객체"가 될 합니다.freed에게 전화를 걸어.free개체에 스토리지 기간이 할당되었다고 합니다.


C 기준은 그게 전부입니다.그것은 특정하지 않습니다.char buff[500]스택에서 할당하거나 스택이 있어야 합니다.그것은 특정하지 않습니다.malloc일부 "스캐너"를 사용해야 합니다.으로 반로컴파내수있다구다습니현할음을대로를 할 수도 .char buff[500]맘에 들다

{
    char *buff = malloc(500);
    free(buff);
}

할 수 있습니다.malloc.

실제로 대부분의 현재 컴파일러 및 환경에서는 자동 변수에 대해 스택이라는 메모리 레이아웃을 사용할 것이며, 스토리지 지속 시간이 할당된 개체는 정리되지 않은 엉망진창 상태를 비유하는 "heap"에서 가져온 것이라고 하지만, 반드시 그래야 하는 것은 아닙니다.

힙 변수는 동적으로 생성할 수 있습니다. 즉, 사용자에게 크기를 묻고 이 크기의 새 변수를 말로할 수 있습니다.

스택 변수의 크기는 컴파일 시 알아야 합니다.

말씀하신 것처럼 스택 변수는 더 빨리 할당되고 액세스됩니다.따라서 컴파일 시 크기를 알 때마다 사용할 것을 권장합니다. 선택의 여지가에는 그지않선수없습다니택할을 .malloc()

이것은 실제로 스택에 할당된 변수입니다.

char buff[500]; // You had a typo here?

그리고 이것은 더미 위에 있습니다.

char *buff = (char *)malloc(500);

당신은 왜 하나를 다른 하나를 사용합니까?

  • char *buff[500],500컴파일 시간 상수여야 합니다.다음과 같은 경우 사용할 수 없습니다.500런타임에 계산됩니다.
  • 반면에, 스택 할당은 즉각적인 반면 힙 할당은 시간이 걸립니다(따라서 런타임 성능 비용이 발생합니다.
  • 스택의 공간은 스레드의 스택 크기(스택 오버플로가 발생하기 전 일반적으로 1MB)에 의해 제한되지만 힙에서는 훨씬 더 많은 공간을 사용할 수 있습니다.
  • OS에서 관리하는 가상 메모리를 2페이지 이상 차지할 정도로 충분히 큰 어레이를 스택에 할당하고 다른 작업을 수행하기 전에 어레이 끝에 액세스하면 보호 장애가 발생할 가능성이 있습니다(OS에 따라 다름).

마지막으로, 호출되는 모든 함수는 스택에 프레임을 가집니다.main함수도 다르지 않습니다.프로그램이 실행되기 시작하면 실행되는 첫 번째 코드가 내부에 있기 때문에 프로그램의 다른 기능보다 더 특별하지 않습니다.the C runtime environment런타임이 자신의 코드 실행을 시작할 준비가 되면 호출됩니다.main당신이 다른 함수를 부르는 것처럼.

그 둘은 동등하지 않습니다.첫 번째는 문자에 대한 포인터가 있는 크기 500(스택)의 배열입니다.두 번째는 인덱싱 연산자와 함께 사용할 수 있는 500개의 메모리 청크에 대한 포인터입니다.

char buff[500];

char *buff = (char *)malloc(sizeof(char)*500);

스택 변수는 할당 해제가 필요하지 않으므로 선호해야 합니다.힙 변수를 사용하면 동적 할당뿐만 아니라 범위 간에 데이터를 전달할 수 있습니다.

언급URL : https://stackoverflow.com/questions/5258724/stack-variables-vs-heap-variables

반응형