나는이 레드햇 리눅스 기반 시스템에서의 gcc에서 컴파일이최대 스택 크기를 사용
void function1(){
if(!some_condition){
function1();
}
}
과 같은 C로 작성하는 기능이있다. 코드에서 사용하는 최대 스택 크기 을 알 수있는 프로파일 링 도구가 있습니까?
나는이 레드햇 리눅스 기반 시스템에서의 gcc에서 컴파일이최대 스택 크기를 사용
void function1(){
if(!some_condition){
function1();
}
}
과 같은 C로 작성하는 기능이있다. 코드에서 사용하는 최대 스택 크기 을 알 수있는 프로파일 링 도구가 있습니까?
Massifvalgrind 제품군에서이 사실을 알려야합니다. 그러나, 당신은 이미 프로그램이 스택을 너무 광범위하게 사용하고 있다는 것을 알고 있습니다. 그래서 그것을 사용하는 것이 많은 도움이 될지 확신하지 못합니다.
코드를 리팩토링해야합니다. 아쉽게도 C는 Scheme이 아니며 컴파일러는 필요하지 않으며 꼬리 재귀 최적화를 수행하지 않습니다. 따라서 재귀 적으로 호출하는 대신 루핑되도록 함수를 재구성하는 것이 좋습니다. 여기에 Stacks and Recursion Elimination에 대한 좋은 읽을 거리가 있습니다.
사실 실제로 코드에서 최대 스택 사용에 대한 표현을 파생시키는 데 관심이 있었지만 감사합니다. 재귀를 제거하려고했습니다. – hrs
제대로 이해했다면 충돌 이전에 프로그램에서 처리 할 수있는 재귀 수준의 수준을 알고 싶습니다. 프로그램에 대한 재귀 수준 카운터 변수를 디버거에서 실행하고 카운터의 값을 확인할 수 있음을 측정하십시오. 그러나 이것은 시스템에 따라 다르며 시스템마다 다를 수 있습니다 (스택 크기가 다를 수 있음). 반복으로 재귀를 제거하는 것은 어렵지 않으며 완전히 문제를 제거 할 수 있습니다. 그런 도움이 필요하면 코드를 게시하십시오. – piokuc
일부 코드의 메모리 요구 사항 계산에 관심이 있습니다. 이 작업을 수행하기 위해 마지막으로 수행 한 작업은 프로그램 시작 부분 (stack_begin = argv)과 재귀 함수 (stack_end = min (stack_end, & temp_variable))에서 스택 포인터 값을 계산한다는 것입니다. 이것으로 스택에 차지하는 최대 공간을 대략 추정했습니다. 그래, 나는 여전히 재귀 호출을 완전히 대체하기를 고대하고있다. 감사합니다. . – hrs
스택 프레임의 크기와 레벨 수를 곱한 값으로, 리턴 포인터 + 프레임 포인터 + 인수 + 로컬 변수입니다. 물론'some_condition'은 레벨 수를 결정합니다. 물론이 경우에는 재귀 호출 후에 아무 작업도 수행하지 않으므로 루프로 변환 할 수 있습니다. –
컴파일 할 GCC 버전과 최적화 플래그는 무엇입니까? 일부 최신 버전의 GCC는 꼬리 재귀 호출을 최적화하기도합니다. 그리고 단순화 된 뼈대가 아닌 실제 코드를 보여주세요! –