의존하며, 이는 일반적으로 C30뿐만 아니라 모든 도구에 적용됩니다.
최적화는 종종 다양한 방법으로 코드를 제거 및 / 또는 재구성합니다. switch 문은 if / else 구문으로 다시 구현되거나 경우에 따라 함께 제거 될 수 있습니다. y = x * 16은 일련의 왼쪽 시프트 등으로 대체 될 수 있습니다. 비록이 마지막 최적화 유형은 일반적으로 여전히 단계적으로 진행될 수 있습니다.
C에서 정의한 구조가 더 이상 존재하지 않고 컴파일러에서 컴파일러가 더 빠르거나 공간을 덜 사용한다고 생각하는 것으로 대체되거나 다시 정렬되기 때문에 C 코드를 통해 디버거를 단계적으로 실행할 수 없습니다. 또한 중단 된 명령어가 더 이상 존재하지 않을 수 있으므로 C 목록에서 중단 점을 설정하는 것이 불가능할 수도 있습니다. 예를 들어 if 문 안에 중단 점을 설정하려고 할 수 있지만 컴파일러는 if 문을 제거했을 수 있습니다. while 또는 for 루프 내에서 중단 점을 설정하려고 시도 할 수 있지만 컴파일러는 해당 루프를 더 이상 존재하지 않도록 풀기를 결정했습니다.
이러한 이유로 최적화를 해제 한 상태에서 디버깅 할 수 있으면 일반적으로 더 쉽습니다. 항상 최적화를 설정 한 상태에서 다시 테스트해야합니다. 이것은 당신이 중요한 것을 놓치고 volatile
간헐적 실패 (또는 다른 이상한)를 일으키는 것을 알 수있는 유일한 방법 입니다.
임베디드 개발의 경우 어쨌든 최적화에주의해야합니다. 특히 타이밍이 중요한 코드 섹션에서 일부 인터럽트가 발생합니다. 이 경우 어셈블리에서 중요한 비트를 코딩하거나 컴파일러 지시문을 사용하여 이러한 섹션이 최적화되지 않았는지 확인하여 실행 시간이 고정되어 있거나 최악의 경우 런타임이 고정되어 있는지 확인해야합니다.
다른 하나는 코드를 uC에 넣을 수 있으므로 코드에 칩을 맞추기 위해 코드 밀도 최적화가 필요할 수 있습니다. 이것이 일반적으로 제품군에서 가장 큰 ROM 용량 uC로 시작하고 코드가 잠긴 후에 제조를 위해 더 작은 것을 선택하는 것이 좋은 이유입니다.