2012-12-19 4 views
2

Visual Studio 2012에서 "전체 프로그램 최적화 -> 링크 타임 코드 생성 사용"외에도/opt : ref/VERBOSE 옵션을 사용합니다./opt : ref는 "링크 타임 코드 생성 사용"을 지정하면 사용하지 않는 함수를 기본적으로 제거한다고 가정했지만 사용되지 않는 함수를 제거해야합니다. 내 테스트 프로그램에서Visual Studio - 최적화 - 사용되지 않는 함수 제거

은 내가 최종 실행 파일에서 제거 할 것으로 예상 테스트 함수를 사용하여 VS 출력 사항을 확인하는 것 : /의 FA로 생성 된 * .ASM 파일을 찾고

Discarded "int __cdecl testMe(int)" ([email protected]@[email protected]) from Test.obj 

그러나 ,은 (는) 최종 이미지에서 제거되지 않았거나 그래서

; Function compile flags: /Ogtp 
; File c:\users\g.m\documents\visual studio 2012\projects\Test.cpp 
; COMDAT [email protected]@[email protected] 
_TEXT SEGMENT 
[email protected]@[email protected] PROC     ; testMe, COMDAT 
... 

: 나는 나열된 기능을 볼 수 있습니까?

편집 : 사소한 코드도 경우 기능에 나는 매우 의심스러운 찾을 무엇

static int testMe(int i) 
{ 
    return i + 1; 
} 

int main() 
{ 
    auto res = testMe(0); 
} 

을 최적화 "정적"입니다 될

는 여전히 * .ASM 파일

에 나타납니다

답변

1

여기서 발생하는 것처럼 보이는 것은 컴파일러가 어셈블리를 생성 할 때 함수를 완전히 최적화하지 못했다는 것입니다 (전체 목록이나 원래 함수를 게시하지는 않았지만 확실치는 않지만) 링커는 참조되지 않았 음을 알 수 있고 그것을 버렸다.

링 생성은 어셈블리 생성 후에 발생하므로 링커에서 수행하는 작업은 중간 어셈블리 출력에 의해 표시되지 않습니다.

최종 실행 파일 만 보시면 알 수 있겠지만 링커가 사실을 말하고 사용자의 기능을 제거한 것 같습니다.

업데이트 :

이 코드를 테스트하는 것은 로컬 내 의심을 확인합니다. 컴파일러는 데드 코드를 최적화하지 않지만 링커는이를 최적화합니다.

+0

샘플로 업데이트되었습니다. – Ghita

+0

필자가 생각하기에, 컴파일러는 아마도 코드에서 참조하기 때문에 함수를 생성하지만 링커는이를 제거합니다. – JasonD

관련 문제