インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス

GAP メッセージ (診断 ID 30760)

メッセージ

未使用のフィールド '%s' を構造体 '%s' から削除します。コンパイラーは、これらのフィールド '%s' のアドレスが取得され、安全に参照されていると仮定しました。

詳細モードでは、プログラム全体で認識されない場合にもこのメッセージが出力されます。

アドバイス

クラスまたは構造体に未使用のフィールドがあります。構造体定義から未使用のフィールドを削除すると、メモリー使用量が減少し、不要なデータがキャッシュを占領しなくなるためキャッシュ効率が向上します。

未使用のフィールドを削除する前に、アプリケーションのほかの領域でそのフィールドにアクセスしていないことを確認する必要があります。 また、構造体フィールドが特定の順序でなければならないコードでは未使用のフィールドを削除する際に注意が必要です。

例えば、アプリケーション・コードでフィールドのアドレスを使用して別のフィールドにアクセスしている場合、未使用のフィールドが削除されると動作しなくなる可能性があります。 そのようなコードは有効なコードとは見なされません。

未使用のフィールドの分析では、アドレスが取得されたフィールドは使用されているものと見なされます。ただし、未使用のフィールドのレポートにはアドレスが取得されたフィールドも含まれます。

次の例について考えてみます。

//unused_field_4.c 
struct str {
    int a1, b1, c1, d1, e1, f1; 
};
 
extern struct str sp[];
 
int hot_func1() {
    int i, ret = 0;
 
    for (i = 0; i < 1000000; i++) {
        ret += sp[i].a1;
        ret += sp[i].b1;
    }
    return ret; 
}
 
int hot_func2() {
    int ret = 0, i;
    for (i = 0; i < 1000000; i++) {
        ret += sp[i].a1;
        ret -= sp[i].c1;
    }
    return ret; 
}
 
int *gip;
 
int hot_func3() {
    int ret = 0, i;
    for (i = 0; i < 1000000; i++) {
        ret += sp[i].d1;
    }
 
    gip = &(sp->f1);
    return ret; 
}

このプログラムをコンパイルすると、次のようなメッセージが表示されます。

drive: program-name: リマーク #30760: (DTRANS) 未使用のフィールド 'e1' を構造体 'str' から削除します。 コンパイラーは、これらのフィールド 'f1' のアドレスが取得されていたため、安全のために参照されていると仮定しました。 ...

この例では、次のようにコードを変更するだけで未使用のフィールドを削除できます。

//unused_field_4.c 
struct str {
    int a1, b1, c1, d1, f1; 
}; 
...

確認

このアドバイスは、現在のコンパイルのフィールド参照に基づくものです。 アプリケーション全体でこれらのフィールドが参照されていないことを確認してください。

関連情報