저는 항상 힙 할당이 컴파일 시간에 알려지지 않은 크기의 데이터 구조를 할당하는 데 필요하다고 생각했습니다. 하지만 최근에 스택에 동적 할당을 허용하는 alloca
에 대해 알게되었습니다. 따라서 힙 할당이 동적 크기 할당에 필요하지 않은 경우 힙 할당이 필요합니까? 내 첫 번째 생각은 데이터 구조의 크기를 조정하는 것이 어려울 수 있지만 힙을 사용하지 않으면 불가능한 것인지 확실하지 않다는 것입니다.힙 할당이 필요한 이유는 무엇입니까?
답변
실제 시간입니다. 힙의 객체는 free()
까지 살고 있습니다. alloca
으로 할당 된 객체는 함수가 반환 될 때까지 현재 스택 프레임에 있습니다.
첫 번째 할당이 충분한 메모리를 예약하지 않은 경우 힙의 데이터 크기를 조정하면 새로운 할당이 발생합니다. 이렇게하면 첫 번째 힙 항목이 다시 무료 목록에 제공됩니다. 스택 프레임에서는 불가능합니다. realloc
펜던트가 없습니다.
BTW : 힙의 개체가 동적 크기 일 필요는 없습니다. malloc
의 함수 시그니처에는 런타임에 크기를 계산할 수있는 크기 매개 변수가 있습니다. 그러나 동적 크기가없는 객체를 할당하는 경우가 많습니다. 예 :
typedef struct {
int a;
char s[3];
} example;
example *ex = malloc(sizeof(example));
free(ex);
편집 : 당신이 realloc
에서 유래를 의미 다릅니다 얻을하지 않는 한 스택에 또 다시 할당 할 수 있지만. realloca
이 더 큰 크기를 할당해야 할 때 공간을 되돌릴 수 없습니다. 크기를 줄이는 것도 불가능합니다. 그 이유는 둘 다 alloca
의 작동 방식 때문입니다. 사용 가능한 목록이 없으며 힙 개체처럼 관리되는 스택에 청크가 없습니다. alloca
의 결과를위한 공간을 제공하는 스택 포인터를 변경하는 것입니다.
"realloca"기능이 없다는 것을 의미한다고 생각합니다. 그러한 함수를 생성하는 것이 가능할 것입니다 (그것은 원래의 할당을 'return' 또는'longjmp'와 같은 스택 프레임을 떠날 때까지 자유롭게하지 않고 항상 더 큰 크기의 새로운 할당을 할당 할 것입니다). 그러나 주어진 일반적으로 스택 기반 할당의 수명이 짧기 때문에 일반적으로 필요하지 않습니다. – mctylr
스택 메모리를 사용하는 것으로 제한하면 데이터의 수명을 생각한 범위의 수명으로 제한 할 수 있습니다. 그렇지만 전역으로 설정할 수는 있지만 메모리 용량은 고정되어 있습니다. 데이터.
대용량 메모리를 확보하는 것은 어떻습니까? 이제 메모리 낭비로 힙을 에뮬레이트하고 있습니다.
힙은 모두가 0
및 1
과 Turning Machine입니다 필요하다 int
이 필요하지 않습니다, double
이 필요하지 않습니다, 필요하지 않습니다.
효율적으로 코드를 작성하고 유지 관리하는 다양한 프로그래밍 모델이 있습니다. 코드는 스택에있는 모든 것과 함께 존재할 수 있습니다. OS/환경 설정 방법에 따라 스택이 힙보다 빨리 실행되지 않습니다. 메모리는 메모리입니다. 일반적인 OS가 올바른 스택보다 큰 스택을 필요로하는 코드보다 오류가 많으므로 스택 크기에 더 엄격한 제한을 두는 것입니다.
프로세서는 너무 크고 제한적인 스택과 상대적으로 막대한 동적 데이터 공간을 허용하는 방식으로 설계되는 경향이 있습니다.
이제는 malloc()
을 통해 가장 가변적 인 대형 할당을 수행하고 틈새 어플리케이션을 위해 alloca()
을 저장하십시오. 어쩌면 Dr. Whippersnapper 최신 프로그래밍 모델 덕분에 20 년 내에 모든 것이 스택에있게 될 것입니다.
- 1. 스토리지 할당이 필요한 이유는 무엇입니까?
- 2. C++ 힙 할당이 Java 힙 할당에 비해 느린 이유는 무엇입니까?
- 3. 배열 포인터에 힙 할당이 필요한 이유는 무엇입니까? (오류 : 예상 ''(함수 스타일 캐스트 또는 형식 구성의 경우) '' '
- 4. 빨간색 영역이있을 때 스택 할당이 필요한 이유는 무엇입니까?
- 5. 문자열 할당이 세그멘테이션 오류를 일으키는 이유는 무엇입니까?
- 6. 이 할당이 스레드로부터 안전하지 않은 이유는 무엇입니까?
- 7. 여러 코어에서 goroutine 할당이 느린 이유는 무엇입니까?
- 8. 이 변수 할당이 오류를 던지는 이유는 무엇입니까?
- 9. NotificationCompat가 필요한 이유는 무엇입니까?
- 10. clientID가 필요한 이유는 무엇입니까?
- 11. LINQ가 필요한 이유는 무엇입니까?
- 12. 피보나치 힙이 계단식 절단이 필요한 이유는 무엇입니까?
- 13. 전달 선언이 필요한 이유는 무엇입니까?
- 14. addRequestHeader 메소드가 필요한 이유는 무엇입니까?
- 15. 번호 접미사가 필요한 이유는 무엇입니까?
- 16. 토큰 체계가 필요한 이유는 무엇입니까?
- 17. Eclipse에서 Ant가 필요한 이유는 무엇입니까?
- 18. 파이썬에서 발전기가 필요한 이유는 무엇입니까?
- 19. 긴 형식이 필요한 이유는 무엇입니까?
- 20. null 종결자가 필요한 이유는 무엇입니까?
- 21. 외부 정렬이 필요한 이유는 무엇입니까?
- 22. 포인터에 형식이 필요한 이유는 무엇입니까?
- 23. j_spring_security_check 404가 필요한 이유는 무엇입니까?
- 24. PhotoCamera에 VideoBrush가 필요한 이유는 무엇입니까?
- 25. 거북이 SVN이 필요한 이유는 무엇입니까?
- 26. 콜백 이벤트가 필요한 이유는 무엇입니까?
- 27. Babel JS가 필요한 이유는 무엇입니까?
- 28. GridView에 BaseAdapter가 필요한 이유는 무엇입니까?
- 29. 웹에 HTTP가 필요한 이유는 무엇입니까?
- 30. 인터페이스에 캐스트가 필요한 이유는 무엇입니까?
'alloca()'- 할당 된 메모리는'alloca()'가 발생한 함수의'return'에서 살아남지 못합니다. 'freea()'alloca'd 메모리도 사용할 수 없습니다.마지막으로 스택은 일반적으로 힙과 비교하여 상당히 유한합니다. –
@IwillnotexistIdonotexist, 답변으로 의견을 게시해야한다고 생각합니다. –
@RSahu 나는이 주제가 한 번 이상 개봉 된 것이 거의 확실하기 때문에 나는 속임수를 실제로 사냥하고 있었다. –