Share via


/OPT(최적화)

업데이트: 2007년 11월

LINK가 빌드하는 동안 수행할 최적화를 제어합니다.

/OPT:{REF | NOREF}
/OPT:{ICF[=iterations] | NOICF}
/OPT:{WIN98 | NOWIN98}

인수

  • REF | NOREF
    /OPT:REF를 사용하면 참조되지 않는 함수와 데이터가 제거되는 반면, /OPT:NOREF를 사용하면 참조되지 않는 함수와 데이터가 유지됩니다.

    기본적으로 LINK에서는 참조되지 않는 패키지 함수를 제거합니다. /Gy 옵션을 사용하여 컴파일한 개체에는 패키지 함수(COMDAT)가 포함되어 있습니다. 이러한 최적화를 전이적 COMDAT 제거라고 합니다. 이 기본값을 무시하고 참조되지 않는 COMDAT를 프로그램에 유지하려면 /OPT:NOREF를 지정합니다. /INCLUDE 옵션을 사용하면 특정 기호는 제거되지 않도록 할 수 있습니다.

    /DEBUG를 지정한 경우 /OPT에는 기본적으로 NOREF가 지정되어 모든 함수가 이미지에 보존됩니다. 그렇지 않은 경우에는 기본적으로 REF가 지정됩니다. 이 기본값을 무시하고 디버깅 빌드를 최적화하려면 /OPT:REF를 지정합니다. /OPT:REF 옵션을 사용하면 증분 링크를 사용할 수 없습니다.

    __declspec(selectany)를 사용하여 명시적으로 데이터를 COMDAT으로 표시해야 합니다.

    /OPT:REF가 지정된 경우 기본적으로 /OPT:ICF가 설정됩니다. /OPT:ICF를 설정하지 않고 /OPT:REF를 설정하려면 다음과 같이 지정해야 합니다.

    link /opt:ref /opt:noicf
    

    /OPT:ICF를 지정해도 /OPT:REF 옵션은 활성화되지 않습니다.

  • ICF[= iterations**] | NOICF**
    동일한 COMDAT를 정리하려면 **/OPT:ICF[=iterations]**를 사용합니다. 중복된 COMDAT는 링커 출력에서 제거할 수 있습니다. iteration은 중복을 찾기 위해 기호를 순회할 횟수를 지정합니다. 기본 반복 횟수는 2입니다. 추가 반복에서는 이전 반복의 정리를 통해 발견되지 않은 중복 COMDAT를 더 많이 찾을 수 있습니다.

    /OPT:REF를 명시적으로 지정하여 기본적으로 ICF가 적용될 때와 /OPT:REF,ICF를 명시적으로 지정할 때의 링커 동작은 서로 다릅니다. /OPT:REF를 지정하여 기본적으로 ICF가 적용되는 경우에는 읽기 전용 데이터를 정리하지 않습니다. 여기에는 모든 .rdata, .pdata 및 .xdata가 포함됩니다. 그러나 /OPT:REF를 지정하여 기본 ICF가 적용되는 경우 Itanium 및 x64용 이미지를 만들 때 정리되는 함수가 적어집니다. 이는 이들 모듈의 함수에 .pdata 및 .xdata 같은 읽기 전용 데이터에 대한 종속성이 더 많기 때문입니다. ICF를 완전하게 적용하려면 명시적으로 /OPT:ICF를 지정하십시오.

    함수는 /Gy 컴파일러 옵션을 사용하여 COMDAT에 배치되며 상수 데이터는 COMDAT에 배치됩니다. 정리할 데이터의 지정 방법 예제는 selectany를 참조하십시오.

    ICFREF를 지정한 경우 기본적으로 적용되며 디버그 빌드에서 명시적으로 설정되어야 합니다. REF가 지정된 경우 NOICF를 지정할 수도 있습니다.

    참고:

    /OPT:ICF를 사용한 결과로 서로 다른 함수나 읽기 전용 데이터 멤버(/Gy로 컴파일된 const 변수)에 동일한 주소가 할당될 수도 있습니다. 따라서 /OPT:ICF를 사용하면 함수나 읽기 전용 데이터 멤버의 주소가 서로 달라야 하는 프로그램이 제대로 실행되지 않을 수 있습니다. 자세한 내용은 /Gy(함수 수준 링크 사용)를 참조하십시오.

  • WIN98 | NOWIN98
    WIN98NOWIN98은 최종 이미지의 섹션 맞춤을 제어합니다. Windows 98 응용 프로그램의 경우에는 섹션을 4K 경계로 맞춰 로드 시간을 개선하는 것이 좋습니다. 이렇게 하면 Windows 98 메모리 관리자는 공간을 많이 낭비하지 않고 실행 이미지를 캐싱할 수 있습니다. 링커에서는 이 옵션이 기본적으로 사용되므로 응용 프로그램을 트리밍하려면 /OPT:NOWIN98을 지정해야 합니다. Windows 98에서의 속도는 느려집니다.

    기본적으로는 WIN98이 설정됩니다. 다음과 같은 경우에는 WIN98이 설정되지 않습니다.

    • /ALIGN을 사용하는 경우

    • /MACHINE의 대상이 x86이 아닌 경우

    • /SUBSYSTEM이 WINDOWS 또는 CONSOLE 이외의 항목을 지정하는 경우

    다음의 평균 증가 방정식에 따라 25퍼센트 이상 커지는 이미지에 대해서는 /OPT:WIN98이 기본적으로 사용되지 않습니다. 즉, 작은 이미지의 경우에는 /OPT:WIN98이 사용되지 않습니다. 이 조정에 영향을 받지 않으려면 /OPT:WIN98을 명시적으로 활성화해야 합니다. /OPT:NOWIN98을 지정하면 응용 프로그램의 크기가 작아지지만 Windows 98에서 느려집니다.

    Windows 98에서의 향상은 이식 가능한 실행 이미지의 섹션이 페이지 경계에서 시작할 때만 작동합니다. /OPT:WIN98 옵션을 사용하면 필요한 파일 맞춤이 수행됩니다.

    Windows NT 또는 Windows 2000에서만 실행되는 구성 요소를 빌드하는 경우에는 /OPT:NOWIN98을 사용해야 합니다.

    이렇게 변경해도 이미지 로드나 프로세스의 작업 집합에는 영향을 주지 않고 디스크 내의 크기에만 영향을 줍니다.

    다음과 같은 방법으로 /OPT:WIN98을 사용할 때 이미지의 평균 증가를 계산할 수 있습니다.

    • 4096바이트 파일 맞춤에 대해 불필요하게 사용된 평균 공간은 count-of-sections-in-image * 4096/2로 나타낼 수 있습니다.

    • 현재의 512바이트 파일 맞춤에 대해 불필요하게 사용된 평균 공간은 count-of-sections-in-image * 512/2입니다.

    따라서 증가는 다음과 같습니다.

    • count-of-bytes-Growth = count-of-sections-in-image * (4096/2 - 512/2)

      또는

      count-of-bytes-Growth = count-of-sections-in-image * 1792

      그러나 여기에서는 이미지 헤더를 섹션 맞춤에 패딩해야 한다는 사실이 고려되지 않았습니다. 헤더는 항상 512 바이트 이하이기 때문에 추가 증가는 4096에서 512를 뺀 상수, 즉 3584입니다.

    • 평균 count-of-bytes-Growth = count-of-sections-in-image * 1792 + 3584

    • 최대 count-of-bytes-Growth = count-of-sections-in-image * (4096 - 512 + 3584)

    섹션의 개수를 구하려면 실행 파일에 대해 DUMPBIN 도구를 사용합니다. 요약 정보를 통해 해당 이미지의 섹션 목록을 볼 수 있습니다. 일반적으로 해당 값에 추가된 3 - 5개의 섹션을 볼 수 있습니다.

    /OPT:WIN98을 사용하면 안되는 유일한 경우는 이식 가능한 실행 이미지가 아주 작을 때입니다. 이미지가 다운로드용으로 예정된 경우에도 불필요하게 사용된 공간은 0으로 채워지므로 압축 효율이 높습니다.

설명

최적화하면 일반적으로 링크 시간이 늘어나는 대신 이미지 크기가 줄어들고 프로그램 속도는 향상됩니다.

/VERBOSE 옵션을 사용하면 /OPT:REF로 제거한 함수와 /OPT:ICF로 정리한 함수를 표시할 수 있습니다.

Visual Studio 개발 환경에서 이 링커 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual C++ 프로젝트 속성 설정을 참조하십시오.

  2. 링커 폴더를 클릭합니다.

  3. 최적화 속성 페이지를 클릭합니다.

  4. 다음 속성 중 하나를 수정합니다.

    • COMDAT 정리 사용

    • Windows98에 맞게 최적화

    • 참조

프로그래밍 방식으로 이 링커 옵션을 설정하려면

참고 항목

참조

링커 옵션 설정

링커 옵션