문제

나한테 기능이 있다고 해봐

void do_something() {
    //....
    #ifdef FEATURE_X
        feature_x();
    #endif
    //....
}

문제 없이 이것을 컴파일하고 실행할 수 있습니다.내가 그 기능을 원한다면 통과할 수 있다 -D FEATURE_X 그리고 그것은 작동합니다.

하지만, 내가 넣고 싶다면 어떻게 해야 할까? do_something 다른 파일로 변환합니다(그리고 옵션을 변경하기로 결정할 때마다 해당 파일을 다시 컴파일할 필요도 없습니다).같은 파일에 있었다면

const int FEATURE_X=0;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

데드 코드 제거를 올바르게 사용하여 호출을 제거합니다.이것을 LTO 없이 다른 파일에 넣으면,

extern const int FEATURE_X;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}

코드는 제거되지 않습니다(알 수 있는 방법이 없습니다).따라서 링크 시간 최적화가 활성화되면 컴파일러가 다음 값을 감지할 수 있습니까? FEATURE_X 링크 타임에 코드가 사용되는지 여부를 확인하고 적절한 경우 제거하시겠습니까?

도움이 되었습니까?

해결책

GCC는 교차 모듈 도달 불가능 함수 제거를 수행하지만 FEATURE_X의 상수 값이 너무 늦게 결정되므로 마지막 테스트 케이스에서 코드가 작동하지 않는지 확인할 수 없습니다.

-D 방식을 사용하거나 const int FEATURE_X=0; 모든 모듈에 포함되면 예, 코드가 제거됩니다.

다른 팁

참조 된 코드 대신에 :

extern const int FEATURE_X;

void do_something() {
    //....
    if(FEATURE_X) {
        feature_x();
    }
    //....
}
.

링크 시간 변수로 수행 된 경우 :

extern const int FEATURE_X;

void do_something() {
    //....
    if(NULL != &FEATURE_X) {
        feature_x();
    }
    //....
}
.

그런 다음 링커 명령 파일에서

를 정의하십시오.
define exported symbol FEATURE_X = 0x0
.

링크 시간에 그것을 최적화하는 데 어쨌든

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top