2

関数があるとします

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リンク時の値を検出し、コードが使用されているかどうかを判断し、必要に応じて削除できますか?

4

2 に答える 2

7

GCC はクロス モジュールの到達不能関数の削除を行いますが、FEATURE_X の定数値の決定が遅すぎるため、最後のテストケースでコードが死んでいると判断することはできません。

-D の方法を使用するか、const int FEATURE_X=0;すべてのモジュールに配置する場合は、はい、コードは削除されます。

于 2012-11-07T17:54:16.483 に答える
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

リンク時に最適化する方法はありますか?

于 2016-08-25T17:37:59.143 に答える