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

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

メッセージ

構造体 '%s' のフィールドの順序を変更することでデータの局所性が向上します。推奨するフィールドの順序: '%s'。

アドバイス

クラスまたは構造体のフィールドを指定された順序で並べ替えてみてください。これにより、プロセッサー・キャッシュがより活用され、パフォーマンスが向上するでしょう。

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

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

// field_reord.c 
struct str {
    int a1, b1, carr[100], c1, d1, e1; 
};
 
extern struct str sp[];
 
int hot_func1() {
    int i, ret = 0;
 
    for (i = 0; i < 1000000; i++) {
        ret += sp[i].a1;
        ret += sp[i].c1;
    }
    return ret; 
}
 
int hot_func2() {
    int ret = 0, i;
    for (i = 0; i < 100000; i++) {
        ret += sp[i].a1;
        ret -= sp[i].e1;
    }
    return ret; 
}
 
int hot_func3() {
    int ret = 0, i;
    for (i = 0; i < 1000000; i++) {
        ret += sp[i].carr[10];
    }
    return ret + sp[0].b1 + sp[0].d1; 
}

このプログラムをコンパイルすると、コンパイラーは「構造体 'str' のフィールドの順序を変更することでデータの局所性が向上します。推奨するフィールドの順序: 'a1, c1, e1, carr, b1, d1'。」というメッセージを生成します。

上記の例では、field_reord.c への変更は次のように構造体 'str' のフィールドを並べ替えるだけです。

// field_reord.c 
struct str {
    int a1, c1, e1, carr[100], b1, d1; 
}; 
...

確認

このアドバイスは、現在のコンパイルのフィールド参照に基づくものです。このコード変更によってオリジナルのプログラムのセマンティクスが変更されないことを確認してください。