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

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

メッセージ

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

このメッセージは、プログラム全体で認識される場合のみ出力されます。

アドバイス

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

未使用のフィールドを削除する前に、アプリケーションのほかの領域でそのフィールドにアクセスしていないことを確認する必要があります。また、構造体フィールドが特定の順序でなければならないコードでは未使用のフィールドを削除する際に注意が必要です。例えば、アプリケーション・コードでフィールドのアドレスを使用して別のフィールドにアクセスしている場合、未使用のフィールドが削除されると動作しなくなる可能性があります。そのようなコードは有効なコードとは見なされません。

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

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

// unused_field_3.c 
struct str {
    int a1, b1, c1, d1, e1, f1; 
};
 
struct str sp[1000000];
 
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; 
}
 
int main() {
    hot_func1();
    hot_func2();
    hot_func3(); 
}

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

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

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

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

確認

このコード変更によってオリジナルのプログラムのセマンティクスが変更されないことを確認してください。

関連情報