이 "오래된"질문에 대한 많은 흥미로운 답변들, 심지어 비교적 새로운 답변들도 있지만 이것에 대한 언급은 찾지 못했습니다 ...
적절하고주의해서 사용하면 alloca()
작은 가변 길이 할당 (또는 사용 가능한 경우 C99 VLA)을 처리하기 위해 (어쩌면 응용 프로그램 전체에서) 일관성있게 사용 하면 고정 길이의 대형 로컬 배열을 사용하는 동등한 구현보다 전체 스택 성장 이 낮아질 수 있습니다 . 그래서 alloca()
수 있습니다 당신의 스택 좋은 당신은 신중하게 사용하는 경우.
나는 그 인용구를 발견했다 .. 좋아, 나는 그 인용구를 만들었다. 하지만 정말로 생각해보십시오.
@j_random_hacker는 다른 답변 아래 그의 의견에 매우 적합합니다. alloca()
대형 로컬 배열을 선호 하여 사용 하지 않는 것이 스택 오버플로에서 프로그램을 더 안전하게 만들지 않습니다 (컴파일러가 alloca()
어떤 경우에 사용해야하는 함수를 인라인 할 수있을 정도로 오래되지 않은 경우) alloca()
내부 루프 를 사용하지 않는 경우, 내부 루프 를 사용 해서는 안됩니다 alloca()
).
나는 데스크탑 / 서버 환경과 임베디드 시스템에서 일했다. 많은 임베디드 시스템은 힙을 전혀 사용하지 않으며 (지원하지도 않습니다), 응용 프로그램에서 메모리 누수의 위험으로 인해 동적으로 할당 된 메모리가 악하다는 인식이 포함됩니다. 한 번에 몇 년 동안 다시 부팅하거나 동적 메모리가 위험하다는 더 합리적인 정당화는 응용 프로그램이 힙을 메모리 소진 지점으로 분할하지 않을 것이라는 점을 확실히 알 수 없기 때문에 위험합니다. 따라서 임베디드 프로그래머에게는 몇 가지 대안이 남아 있습니다.
alloca()
(또는 VLA)는 해당 직무에 적합한 도구 일 수 있습니다.
프로그래머가 스택 할당 버퍼를 "가능한 경우를 처리하기에 충분히 큰"시간과 시간을 다시 보았습니다. 깊게 중첩 된 호출 트리에서 해당 (anti-?) 패턴을 반복해서 사용하면 스택 사용이 과장됩니다. (20 레벨 깊이의 콜 트리를 상상해보십시오. 다른 이유로 각 레벨에서이 함수는 일반적으로 16 개 이하의 버퍼 만 사용하는 경우 "안전하게"1024 바이트의 버퍼를 맹목적으로 할당합니다. 드문 경우에는 더 많이 사용할 수 있습니다.) 대안은alloca()
또는 스택에 불필요하게 부담을주지 않도록 함수에 필요한만큼의 스택 공간 만 할당하십시오. 호출 트리의 한 함수가 정상보다 큰 할당을 필요로 할 때, 호출 트리의 다른 함수는 여전히 정상적인 작은 할당을 사용하고 있으며, 전체 함수 스택 사용량이 모든 함수가 로컬 버퍼에 맹목적으로 초과 할당 된 경우보다 훨씬 적습니다. .
그러나 사용하기로 선택하면 alloca()
...
이 페이지의 다른 답변에 따르면 VLA는 안전해야합니다 (루프 내에서 호출되면 스택 할당을 복합화하지 않음)하지만 alloca()
을 사용하는 경우 루프 내에서 사용하지 않도록주의하십시오. 다른 함수의 루프 내에서 호출 될 가능성이있는 경우 함수를 인라인 할 수 없는지 확인 하십시오.