「C」配列のパフォーマンスが必要であるが、追加の安全性と STL のようなセマンティクス (反復子begin()
などend()
) が必要な場合は、 を使用しますboost::array
。
基本的には、いくつかのNDEBUG
-disable-able 範囲チェック アサート (およびいくつかのstd::range_error
例外スロー アクセサー) を持つ 'C' 配列のテンプレート化されたラッパーです。
私は次のようなものを使用します
boost::array<boost::array<float,4>,4> m;
それ以外の
float m[4][4];
常にうまく機能します(とにかく、冗長性を抑えるための適切なtypedefを使用します)。
更新:ここのコメントでboost::array
vsの相対的なパフォーマンスに関するいくつかの議論に続いて、1333MHz DDR3 RAM を搭載した Q9450 で Debian/Lenny amd64 でboost::multi_array
コンパイルされたこのコードは、 では3.3 秒、 では 0.6 秒かかることを指摘します。g++ -O3 -DNDEBUG
boost::multi_array
boost::array
#include <iostream>
#include <time.h>
#include "boost/array.hpp"
#include "boost/multi_array.hpp"
using namespace boost;
enum {N=1024};
typedef multi_array<char,3> M;
typedef array<array<array<char,N>,N>,N> C;
// Forward declare to avoid being optimised away
static void clear(M& m);
static void clear(C& c);
int main(int,char**)
{
const clock_t t0=clock();
{
M m(extents[N][N][N]);
clear(m);
}
const clock_t t1=clock();
{
std::auto_ptr<C> c(new C);
clear(*c);
}
const clock_t t2=clock();
std::cout
<< "multi_array: " << (t1-t0)/static_cast<float>(CLOCKS_PER_SEC) << "s\n"
<< "array : " << (t2-t1)/static_cast<float>(CLOCKS_PER_SEC) << "s\n";
return 0;
}
void clear(M& m)
{
for (M::index i=0;i<N;i++)
for (M::index j=0;j<N;j++)
for (M::index k=0;k<N;k++)
m[i][j][k]=1;
}
void clear(C& c)
{
for (int i=0;i<N;i++)
for (int j=0;j<N;j++)
for (int k=0;k<N;k++)
c[i][j][k]=1;
}