0

検討

Foo data[]={{...},{...},{...}};
Foo data_end={...};

エンドマーカーが配列の直後に定義されている場合、それは保証されていますか?

&data[3]==&data_end

データの要素数を手動でカウントする必要はありません。

たまたま最適化オプションがなくても gdb で問題ないように見えますが、それを使用する前に、コンパイラが移動できないことを知っておく必要がありdata_endます。できる場合は、代わりにどうすればよいですか。

4

3 に答える 3

1

いいえ。コンパイラが変数を任意の順序またはアラインメントで配置するという信頼できる仮定ではありません。アラインメントのために変数間にギャップが生じる可能性があり、変数をアルファベット順に並べるコンパイラーを既に見てきました。

配列にない要素へのポインタを知りたい場合は、配列要素の数を知る必要があります。

#define _dimof(a) (sizeof(a)/sizeof(a[0]))
Foo data[] = ... ;
// The type of the variable has been changed.
Foo* data_end = &data[_dimof(data)];

この段落は、コードの構文エラーを修正するために追加されているため、削除できます。

于 2015-01-03T11:16:09.487 に答える
0

いいえ、信頼できません。C++11 では、そのまま実行してください。

for (/* const */ Foo& foo : data) {
    // stuff with foo.
}
于 2015-01-03T11:52:17.633 に答える