Если вы хотите производительность массива 'C', но с добавленной безопасностью и STL-подобной семантикой (итераторы, begin()
& end()
и т. Д.), Используйте boost::array
.
По сути, это шаблонная оболочка для массивов 'C' с некоторыми NDEBUG
-подключаемыми утверждениями о проверке диапазона (а также некоторыми std::range_error
компонентами, генерирующими исключения).
Я использую такие вещи, как
boost::array<boost::array<float,4>,4> m;
вместо
float m[4][4];
все время, и это прекрасно работает (с соответствующими определениями типов, во всяком случае, для уменьшения многословия).
ОБНОВЛЕНИЕ: После некоторого обсуждения в комментариях относительно производительности boost::array
против boost::multi_array
я бы отметил, что этот код, скомпилированный с g++ -O3 -DNDEBUG
в Debian / Lenny amd64 на Q9450 с 1333 МГц ОЗУ DDR3 занимает 3,3 с для boost::multi_array
против 0,6 с для 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;
}