5

私のコードでは、内部配列が固定次元である配列の配列を考慮する必要があります。STLアルゴリズムを利用するには、実際にデータを配列の配列として格納すると便利ですが、フラット化されたCスタイルの配列を使用するCライブラリにそのデータを渡す必要もあります。

多次元配列を安価に、そしてポータブルな方法で変換(つまりフラット化)できるのは素晴らしいことです。私は非常に単純なケースに固執します、本当の問題はより一般的です。

struct my_inner_array { int data[3]; };
std::vector<my_inner_array> x(15);

&(x[0].data[0])

xと同じエントリを含むサイズ45*sizeof(int)のメモリの連続ブロックへのポインタ?それとも、位置合わせについて心配する必要がありますか?これは(少なくとも特定のデータ型と内部配列サイズでは)機能するのではないかと思いますが、移植性はありません。

  1. このコードは移植可能ですか?
  2. そうでない場合、それを機能させる方法はありますか?
  3. そうでない場合、私にできることについて何か提案はありますか?
  4. my_inner_arrayがPOD構造体ではないが、いくつかのメソッドが含まれている場合(クラスに仮想メソッドが含まれていない限り)、何かが変更されますか?
4

1 に答える 1

2

1 理論的にはいいえ。コンパイラは、my_inner_array にパディングを追加することを決定する場合があります。実際には、配列を含む構造体にコンパイラがパディングを追加する理由がわかりません。そのような場合、そのような構造体の配列を作成するアライメントの問題はありません。コンパイル時のアサートを使用できます。

typedef int my_inner_array_array[3];
BOOST_STATIC_ASSERT(sizeof(my_inner_array) == sizeof(my_inner_array_array));

4 仮想メソッドがない場合、違いはありません。

于 2012-04-11T10:38:09.337 に答える