2014-12-12 2 views
0

저는 항상 힙 할당이 컴파일 시간에 알려지지 않은 크기의 데이터 구조를 할당하는 데 필요하다고 생각했습니다. 하지만 최근에 스택에 동적 할당을 허용하는 alloca에 대해 알게되었습니다. 따라서 힙 할당이 동적 크기 할당에 필요하지 않은 경우 힙 할당이 필요합니까? 내 첫 번째 생각은 데이터 구조의 크기를 조정하는 것이 어려울 수 있지만 힙을 사용하지 않으면 불가능한 것인지 확실하지 않다는 것입니다.힙 할당이 필요한 이유는 무엇입니까?

+5

'alloca()'- 할당 된 메모리는'alloca()'가 발생한 함수의'return'에서 살아남지 못합니다. 'freea()'alloca'd 메모리도 사용할 수 없습니다.마지막으로 스택은 일반적으로 힙과 비교하여 상당히 유한합니다. –

+0

@IwillnotexistIdonotexist, 답변으로 의견을 게시해야한다고 생각합니다. –

+0

@RSahu 나는이 주제가 한 번 이상 개봉 된 것이 거의 확실하기 때문에 나는 속임수를 실제로 사냥하고 있었다. –

답변

1

실제 시간입니다. 힙의 객체는 free()까지 살고 있습니다. alloca으로 할당 된 객체는 함수가 반환 될 때까지 현재 스택 프레임에 있습니다.

첫 번째 할당이 충분한 메모리를 예약하지 않은 경우 힙의 데이터 크기를 조정하면 새로운 할당이 발생합니다. 이렇게하면 첫 번째 힙 항목이 다시 무료 목록에 제공됩니다. 스택 프레임에서는 불가능합니다. realloc 펜던트가 없습니다.

BTW : 힙의 개체가 동적 크기 일 필요는 없습니다. malloc의 함수 시그니처에는 런타임에 크기를 계산할 수있는 크기 매개 변수가 있습니다. 그러나 동적 크기가없는 객체를 할당하는 경우가 많습니다. 예 :

typedef struct { 
    int a; 
    char s[3]; 
} example; 

example *ex = malloc(sizeof(example)); 
free(ex); 

편집 : 당신이 realloc에서 유래를 의미 다릅니다 얻을하지 않는 한 스택에 또 다시 할당 할 수 있지만. realloca이 더 큰 크기를 할당해야 할 때 공간을 되돌릴 수 없습니다. 크기를 줄이는 것도 불가능합니다. 그 이유는 둘 다 alloca의 작동 방식 때문입니다. 사용 가능한 목록이 없으며 힙 개체처럼 관리되는 스택에 청크가 없습니다. alloca의 결과를위한 공간을 제공하는 스택 포인터를 변경하는 것입니다.

+0

"realloca"기능이 없다는 것을 의미한다고 생각합니다. 그러한 함수를 생성하는 것이 가능할 것입니다 (그것은 원래의 할당을 'return' 또는'longjmp'와 같은 스택 프레임을 떠날 때까지 자유롭게하지 않고 항상 더 큰 크기의 새로운 할당을 할당 할 것입니다). 그러나 주어진 일반적으로 스택 기반 할당의 수명이 짧기 때문에 일반적으로 필요하지 않습니다. – mctylr

1

스택 메모리를 사용하는 것으로 제한하면 데이터의 수명을 생각한 범위의 수명으로 제한 할 수 있습니다. 그렇지만 전역으로 설정할 수는 있지만 메모리 용량은 고정되어 있습니다. 데이터.

대용량 메모리를 확보하는 것은 어떻습니까? 이제 메모리 낭비로 힙을 에뮬레이트하고 있습니다.

0

힙은 모두가 01Turning Machine입니다 필요하다 int이 필요하지 않습니다, double이 필요하지 않습니다, 필요하지 않습니다.

효율적으로 코드를 작성하고 유지 관리하는 다양한 프로그래밍 모델이 있습니다. 코드는 스택에있는 모든 것과 함께 존재할 수 있습니다. OS/환경 설정 방법에 따라 스택이 힙보다 빨리 실행되지 않습니다. 메모리는 메모리입니다. 일반적인 OS가 올바른 스택보다 큰 스택을 필요로하는 코드보다 오류가 많으므로 스택 크기에 더 엄격한 제한을 두는 것입니다.

프로세서는 너무 크고 제한적인 스택과 상대적으로 막대한 동적 데이터 공간을 허용하는 방식으로 설계되는 경향이 있습니다.

이제는 malloc()을 통해 가장 가변적 인 대형 할당을 수행하고 틈새 어플리케이션을 위해 alloca()을 저장하십시오. 어쩌면 Dr. Whippersnapper 최신 프로그래밍 모델 덕분에 20 년 내에 모든 것이 스택에있게 될 것입니다.

관련 문제