사용하지 않는 기능은 최적화됩니까?
아주 간단한 질문인데...요즘 컴파일러는 상당한 양의 최적화를 수행하는 경향이 있습니다.사용하지 않는 기능도 최종 출력에서 삭제합니까?
컴파일러에 따라 다릅니다.Visual C++9에서 가능 - 미사용static
함수는 컴파일 단계에서 삭제됩니다(C4505 경고도 있습니다).외부 링크 미사용 함수는 링커 설정에 따라 링크 단계에서 삭제할 수 있습니다.
MSVC(Visual Studio 컴파일러/링커)는 와 컴파일하여와 링크하는 경우 이를 수행할 수 있습니다.
GCC/binutils는 와 함께 컴파일하여와 링크하는 경우 이를 수행할 수 있습니다.
다른 컴파일러에 대해서는 모릅니다.
gcc를 사용하면 옵션을 켜면 사용되지 않는 기능과 데드 코드를 제거할 수 있습니다.
gcc 최적화에 대한 자세한 내용은 여기를 참조하십시오.
일반적으로 답은 다음과 같습니다.
○: 미사용의 경우static
기능들.
아니요: 미사용 글로벌 기능.
컴파일러는 다른 컴파일 유닛이 참조하는지 여부를 알 수 없습니다.또한 대부분의 오브젝트 모듈유형에서는 컴파일 후 함수를 삭제할 수 없습니다.또한 내부 참조가 존재하는지 여부를 링커에서 확인할 수 있는 방법도 없습니다.(링커는 외부 링크가 있는지 여부를 판별할 수 있습니다).일부 링커들은 그것을 할 수 있지만 많은 것들이 이것에 반대한다.
물론 공유 라이브러리의 일부가 아닌 한 자체 모듈의 함수는 링커에 의해 불필요하게 로드되지 않습니다.(앞으로 런타임에 참조될 수 있기 때문입니다.)
많은 컴파일러가 대응하고 있습니다만, 실장에 따라 다릅니다.디버깅 빌드에는 디버거 내에서 호출하거나 검사할 수 있도록 모든 함수가 포함되어 있는 경우가 많습니다.대부분의 임베디드 시스템 컴파일러는 제가 완전히 이해하지 못하는 이유(*)로 인해 함수가 모두 포함된 경우 오브젝트 파일에 포함되지만 전혀 사용되지 않는 오브젝트 파일은 모두 생략됩니다.
Reflection을 지원하는 언어(예: Java, C#, vb.net 등)에서는 함수의 이름을 지정하면 코드에 참조가 없는 경우에도 런타임에 참조를 생성할 수 있습니다.예를 들어, 루틴은 콘솔에서 문자열을 수신하여 어떤 방식으로든 그것을 머지하고 해당 이름의 함수에 대한 콜을 생성할 수 있습니다.컴파일러나 링커는 어떤 이름이 생성될 수 있는지 알 수 없기 때문에 어떤 함수가 코드에서 안전하게 누락될 수 있는지 알 수 없습니다.그러나 C 또는 C++에는 이러한 어려움이 없습니다.이는 코드 내에 명시적 참조가 존재하지 않는 한 코드가 함수, 변수 또는 상수에 대한 참조를 생성하는 정의된 방법이 없기 때문입니다.일부 구현에서는 연속적으로 선언된 상수 또는 변수가 저장되도록 배치될 수 있으며, 따라서 앞서 선언된 상수 또는 변수에 오프셋을 추가하여 나중에 선언된 상수 또는 변수에 대한 참조를 생성할 수 있지만 이러한 트릭의 동작은 C 또는 C++ 표준에서는 명시적으로 보장되지 않습니다.
(*)컴파일 및 링크가 쉬워지는 것은 이해하지만, 오늘날의 컴퓨터는 과거 수십 년 동안 실용화되었던 것보다 더 정교한 컴파일 및 링크 알고리즘을 실행하는 데 어려움이 없을 것입니다.다른 것이 없다면, 2패스 프리 컴파일/프리링크/컴파일/링크 방식은 프리 컴파일/링크 단계에서 사용되는 항목의 목록을 생성하고, "실제" 컴파일/링크 단계에서는 사용되지 않는 항목을 제외할 수 있습니다.
네, 꽤 많이요.흔히 링커 스트리핑이라고 합니다.
MS의 경우 링크 단계에서 이를 처리하는 것은 링커이며, 사용하지 않는 정적 함수(파일 범위)에 대해 컴파일러가 경고할 수 있습니다.링커에서 사용되지 않는 함수를 삭제하려면 /OPT를 사용합니다.REF 옵션:
MSVC에서 글로벌 함수 또는 변수와 함께 __declspec()을 사용할 수 있습니다.
링커 옵션 /OPT:REF(Optimizations)를 선택한 경우 코드 내에서 참조되지 않은 함수 또는 변수가 제거됩니다.
언급URL : https://stackoverflow.com/questions/6215782/do-unused-functions-get-optimized-out
'programing' 카테고리의 다른 글
Java Result 결과가 있는지 확인하는 방법을 설정합니다. (0) | 2022.07.03 |
---|---|
Collections.emptyList()와 새 인스턴스 비교 (0) | 2022.07.03 |
v-bind에서 Vuex 액세스 (0) | 2022.07.02 |
정적 초기화 코드 블록과 비정적 초기화 코드 블록의 차이점은 무엇입니까? (0) | 2022.07.02 |
Vuejs(vuex) 오류 알 수 없는 로컬 변환 유형 (0) | 2022.07.02 |