alloca
현실에서 얼마나 널리 사용 됩니까? 학생들에게 alloca
이해가되었을 때 사용하도록 가르쳐야 합니까? 아니면 절대 사용하지 말라고 가르쳐야합니까? C ++ RAII 배경에서 비롯된 free
것으로, 특히 여러 개의 종료 점이있는 함수에서 수동으로 호출 할 필요가 없다는 생각이 들립니다.
alloca
현실에서 얼마나 널리 사용 됩니까? 학생들에게 alloca
이해가되었을 때 사용하도록 가르쳐야 합니까? 아니면 절대 사용하지 말라고 가르쳐야합니까? C ++ RAII 배경에서 비롯된 free
것으로, 특히 여러 개의 종료 점이있는 함수에서 수동으로 호출 할 필요가 없다는 생각이 들립니다.
답변:
일반적인 C 프로그래밍 과정을 수강 하는 경우 표준이 아닌 것을 가르쳐서 는 안됩니다. 초보 프로그래머는 비표준 및 / 또는 이식 불가능한 코드를 불필요하게 작성해야합니다. 이러한 방식으로 가르쳐 졌기 때문에 지난 20-30 년 동안 소프트웨어 업계에서 큰 문제가되었습니다. 그들에게 표준을 가르치지 않고 표준을 가르치는 데 드는 비용은 천문학적 일 것입니다.
알고리즘이나 응용 프로그램 프로그래밍에 대한 고급 과정을 보유하고 있다면 언급하는 것이 좋습니다. 반면에, 하드 리얼 타임 임베디드 앱에서 Windows 애플리케이션 보풀에 이르기까지 그 기능을 사용하지 않고 15 년 동안 모든 것을 프로그래밍했습니다.
두 가지 일이 발생하는 것을 볼 수 있습니다.
학생들은의 영향을 이해하고 alloca
스택과 힙의 차이점에 대해 읽고 alloca
신중하게 사용 합니다. (있을 것 같지 않게)
학생들은 "와우, malloc
걱정하지 않아도됩니다. "라고 생각 free
합니다. 과도하게 사용하고 스택 오버플로가 발생하며 무슨 일이 일어나고 있는지 전혀 모릅니다.
설명 alloca
하고이 코드를 실행 하면 훨씬 낫다고 생각합니다 .
#include <malloc.h>
int OverflowMyStack(int start) {
if (start == 0)
return 0;
char * p = (char *)_alloca(4096);
*p = '0';
return OverflowMyStack(start - 1);
}
int main () {
return OverflowMyStack(512);
}
출처 : http://www.strchr.com/alloca
그들에게 위험을 보여주고 사용하지 말라고 지시하십시오. 그들은 여전히 스택 대 힙에 대해 배우고, 위험을 감수하고, 표준적인 것들로 나아갈 수 있습니다.
_alloca
아닌 코드를 사용 alloca
합니까? 왜 결과가 나오나요?
이 질문에 대한 답 은 먼저 목표가 무엇인지에 근거해야합니다 .
C를 작성하고 기존 C 코드로 작업하는 방법을 이미 프로그래밍하는 방법을 이미 알고있는 사람에게 가르치고 싶습니까? 그렇다면 alloca 및 기타 원하는 사항을 알려주십시오.
반면에 우연의 일치로 C 만 사용하는 입문 과정을 가르치는 경우 (C는 매우 작은 언어이기 때문에) 중요한 부분 (모듈 식 프로그램, 서브 루틴, 모음 작성 등)에 중점을 두어야합니다. ). malloc이 대부분의 경우 충분하기 때문에 학생의 관점에서 alloca는 중요한 중복이며 좋은 코드 관점에서는 수동 메모리 관리가 성가신 방법과 다른 언어 가이 문제를 처리 하는 방법을 명시 적으로 언급하는 것이 좋습니다. 메모리 관리에 관한 것들을 alloca 또는 RAII로 제한하기 때문에 여러분은 이것들에 대해 스스로를 제한해서는 안되며 이미 언급했듯이, 다른 언어로 작업을 수행하는 다른 "보다 표준적인"방법과 비교하면 alloca의 목적을 이해하기가 훨씬 쉽습니다. (또는 C99 ...)
아니.
C 프로그래머가 alloca의 존재를 인식해야하는 유일한 이유는이를 사용하는 레거시 코드를 이해하고 수정하는 것입니다.
의 사용은 alloca
하나입니다
실제 사례를 찾지 못한 몇 가지 사고 실험 외에도 alloca
쓸모 없거나 취약하지 않은 (또는 위의 2 가지 중 하나) 사용 사례는 없습니다 (또는 VLA).
alloc
고정 크기 자동 어레이와 100 % 동일하며 휴대 성이 떨어집니다.
T foo[5000];
경우 아무거나 사용할 수 있습니다 .
std::mutex
커널 호출과 컨텍스트 스위치를 5 천 개의 뮤텍스에 대해 호출 할 수 있습니다. 싸지 않다. 배열 뒤에 로컬 변수를 배치하는 데 필요한 추가 캐시 비용은 말할 것도 없습니다.
GCC의 문서 에 몇 가지 실제적인 장단점이 있습니다 alloca()
. 실질적인 관점에서 볼 때 적절한 양의 자유 소프트웨어가 소프트웨어를 사용하므로 기존 코드에서 작동 방식과 사용 위치를 이해하는 것이 좋습니다.
-Wl,-stack=
새 스택 크기 를 gcc로 전달 하면 최대 스택 크기가 증가합니다. 프로젝트에서을 사용 alloca()
하거나 큰 임시 배열을 할당하거나 특정 상황에 따라 다른 깊이를지나 재귀를 사용하는 경우이 작업을 수행해야합니다 .