2011-07-16 4 views
3

내 C 코드에서 전역 최적화를 설정하기 위해 GCC pragma optimize를 사용하려고합니다. GCC 버전은 우분투에서 4.4.3입니다. 기본적인 아이디어는 기능별 최적화 수준을 사용하는 것입니다. 나는 README를 확인#pragma GCC를 사용하는 C 코드 최적화

passrecovery.c: In function âmainâ: 
passrecovery.c:493: internal compiler error: Segmentation fault 
Please submit a full bug report, 
with preprocessed source if appropriate. 
See <file:///usr/share/doc/gcc-4.4/README.Bugs> for instructions. 
make: *** [all] Error 1 

-

#pragma GCC optimize ("O3") 

나는 내가 그것을 빌드 할 때

는하지만, 나는 다음과 같이 컴파일 오류를 얻으려면 내 C 코드에서 내 주요 기능 전에 컴파일 오류 를 얻을 수 .Bugs 파일, 오류에 언급했지만 이것에 관한 단서를 찾을 수 없습니다.

4.4.3 GCC에서 지원되는 #pragma optimize은 지원되는가요?

그렇다면 코드를 최적화하기 위해이 pragma를 잘못 사용하고 있습니다.

속도에 대한 코드 최적화를위한 다른 대안 GCC 지시문은 무엇입니까?

편집 : 나는 심지어 다음 #pragma GCC optimize ("O3") 및 파일 #pragma GCC pop_options의 말에 #pragma GCC push_options을 시도; 같은 오류. 마지막 질문에 대한

답변

8

얼음 (내부 컴파일러 오류) 주요 컴파일러에 항상 버그 그래서 버그를 신고하라고하는 이유입니다. 유효하거나 무효 한 소스 코드로 컴파일러를 크래시 할 수 없어야합니다. (일어날 수있는 모든 일들이있을 수 있으며, 종종 잘못된 코드를 컴파일하는 것을 거절하지만, 충돌은 그 중 하나가 아닙니다.)

GCC 4.6.1은 최신 버전이기 때문에, GCC의 최신 버전 (4.4.3이 전부는 아니다).

버그 보고서를 제출하기 전에 복제를 최소화해야합니다. 494 라인 이후의 모든 것은 아마도 중요하지 않습니다. 행운과 함께 라인 1과 493 사이의 물질을 거의 500에서 20 정도로 줄일 수 있습니다. 오류를 보존하면서 최대한 줄일 것을 목표로해야합니다. 코드를 자르기 전에 컴파일러와 충돌하는 버전을 보존하십시오. 크래시를 유지하면서 코드를 성공적으로 제거하면 각 버전을 VCS에 체크인하십시오. (은 VCS를 사용하여입니다. 그것은 수사학적인 질문입니다. 그렇지 않다면 시작하기에 좋은 시점입니다. 실행 취소 할 수없는 변경을하지 않으려면 필요합니다. 표준 헤더를 제거하기 전에 비표준 헤더 (작성한 헤더)를 사용하십시오. 가능한 한 많은 헤더를 제거하십시오. 전처리 된 소스에 대한 요청을 주목하십시오. 제가 말하고있는 코드 축소는 전처리 된 소스의 크기를 줄입니다.

+0

참고 :이 최적화 지시문을 main()에서 사용하려고했습니다. 그게 문제인 것처럼 보입니다. 이 지시자는 다른 함수 (메인이 아닌)에 쓰일 경우 잘 동작합니다 ( – goldenmean

+0

). @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? 이 코드에서만 사용하는 라이브러리는 -lcrypt (crypt.h), string.h, stdio.h, stdlib.h, ctype.h입니다. – goldenmean

+0

@ goldenmean : ''을 (를) 제거하려고 시도하는 것이 좋습니다. 우선 가장 먼저해야 할 일은 ... 음, 두 번째입니다. 처음 490 줄의 내용을보고 충돌을 보존하면서 무엇이 삭제 될 수 있는지 확인해야합니다. 주석을 먼저 사용한 다음 삭제할 수 있습니다. 코드 줄을 옮길 수는 없습니다.그러나 그것은 거의 일어나지 않을 것입니다. 제거 된 모든 행은 이점입니다. 프로그램이 자신의 헤더를 사용하지 않는다는 것은 인생을 단순화합니다. –

4

: 별도의 컴파일 단위에 넣고 명령 줄 스위치를 사용할 수 있습니다 세그먼트 오류에 -O3