2014-09-03 3 views
0

아마도 내 질문은 어리 석다. 그러나 나는 어떤 대답도 찾지 못했고 실제로 그것을 알고 싶어합니다. 우리가 호출되지 않은 함수를 가진 프로그램을 가지고있을 때 (예를 들어 나중에 구현하기 위해서만 준비된 것입니다.) 컴파일러가이 라인들 (최소한 함수 선언)을 읽었을 것이라고 생각합니다. 더 큰 프로젝트에서 성능에 대해서는 아무런 문제가 없습니다. 더 큰 영향을 끼칠 수있는 것들 (예 : 할당/파일 포함)이 있습니까? 예를 들어실행 코드가 아닌 코드

는 :

//never called/used 
class abc{ 
... 
} 

//never called/used 
float function_A(float x, int y){ 

...} 

int main(){ 
... 
} 

이 짧은 예입니다하지만 난 모든 사람이 무슨 뜻인지 알 것 같아요. 대단히 감사합니다!

+1

"성능"을 정의하십시오. – Quentin

+1

이것은 [데드 코드] (http://en.wikipedia.org/wiki/Dead_code)라고 불리며 일반적으로 나쁜 습관으로 간주됩니다. 그러나 많은 경우 (예 : 표준 STL 인스턴스 생성 ...) 불가피합니다. 컴파일러가 잘 최적화되면 불필요한 코드가 제거됩니다. –

+0

예를 들어 응용 프로그램 실행 시간, 메모리 사용량 ... 많은 점이 있습니다. 나는 그것이 당신의 어플리케이션에 어떤 영향을 미치는지 그리고 피하는 것이 더 좋은 문제가있는 부분이 있는지 궁금합니다. – astrak

답변

2

컴파일러의 현재 구현은 here을 읽을 수 있으므로 일종의 기능을위한 코드를 생성하지 않습니다. 사용되지 않는 코드는 특히 함수를 선언하고 정의하지 않은 경우 성능이 저하되지 않습니다. 많은 명령어가있는 함수 만 성능에 영향을 미칠 수 있으므로 instruction caching에 대한 정보를 읽어 보시기 바랍니다.

큰 라이브러리에서는 파일을 포함해야합니다. 지능적으로 사용하면 (더 중요하게) 컴파일 타임에 성능을 얻을 수 있습니다. 나는 헤더 파일에 forward 선언문을 사용하고 cpp 파일에 헤더를 포함시킨다. 또 다른 문제는 몇 가지 헤더 파일로 분할 한 경우 링크를 사용하지 않으면 컴파일러가 전체 .o 파일 (컴파일 중에 컴파일러에서 생성)을 건너 뛸 수 있다는 것입니다. 희망이 조금 도움이 되었습니까

+0

헤더 파일을 분할해도 오브젝트 파일에는 영향을 미치지 않습니다. 소스 코드에 대한 사전 처리 단계입니다. – darklon

+0

당신이 말한대로 그것은 객체 파일에 영향을 미치지 않을 것이지만 그것들을 다루는 링커의 행동에 대해 – lifeOfPI

+0

타입이나 함수 정의 나 forward 선언은 function/class/whatever를 참조하지 않을 것입니다. 따라서 일반적으로 링커에 영향을 미치지 않습니다. 한 가지 예외는 클래스의 인스턴스를 실제로 선언했는데 헤더에서 일반적으로 수행되지 않는 경우입니다. 내가 생각할 수있는 또 다른 예외는 #pragma comment (lib ...)와 같은 것을 사용하지만 컴파일러와 관련이있다. – darklon

0

컴파일러가이를 데드 코드로 감지 할 수 있으면 완전히 제거하고 경고를 출력합니다. 그렇지 않으면 객체 코드 크기가 증가합니다. 정적 링키지를 사용하면 링커는 사용하지 않는 함수를 제거합니다.

1

응용 프로그램 성능을 의미하는 경우 사용되지 않는 코드를 그대로두면 아무런 영향을 미치지 않습니다. 컴파일러는 데드 코드 제거를 수행합니다. 그러나 더 많은 코드를 거치지 않으면 컴파일러가 약간 느려지므로 프로그램 컴파일을 위해 조금 더 기다려야합니다. 하나의 헤더 파일이 수십 또는 수백 개의 다른 파일을 가져올 수 있으므로 사용하지 않는 헤더 파일은 포함하지 않는 것이 좋습니다. (그러나 미리 컴파일 된 헤더도 도움이 될 수 있습니다.)

1

제거되지 않은 데드 코드로 인해 프로그램의 전체적인 위치가 줄어들면 명령 캐싱이 여전히 문제가 될 수 있습니다.

B가 A에서 반복적으로 호출되는 두 개의 함수 A와 B를 상상해보십시오. A와 B가 같은 캐시 라인에 들어가면 A에서 B를 호출하면 캐시 미스가 생기기 어렵습니다. 그러나 세 번째 함수가 링커에 의해 두 함수 사이에 배치되어 A와 B가 더 이상 같은 캐시 라인에 있지 않으면 B를 호출 할 때 캐시 미스가 발생하여 전반적인 실행 속도가 감소합니다.

효과가 잘 측정되지 않을 수도 있고 다른 많은 요소에 따라 달라질 수 있지만, 일반적으로 데드 코드를 줄이는 것이 좋습니다.

관련 문제