如果您想要“C”数组性能,但要增加安全性和类似 STL 的语义(迭代器等begin()
)end()
,请使用boost::array
.
基本上,它是“C”数组的模板化包装器,带有一些NDEBUG
可禁用的范围检查断言(以及一些std::range_error
抛出异常的访问器)。
我使用类似的东西
boost::array<boost::array<float,4>,4> m;
代替
float m[4][4];
一直都很好,而且效果很好(无论如何,使用适当的 typedef 来降低冗长)。
更新:boost::array
在此处对vs的相对性能的评论中进行了一些讨论后boost::multi_array
,我要指出,g++ -O3 -DNDEBUG
在 Debian/Lenny amd64 上编译的这段代码,在 1333MHz DDR3 RAM 的 Q9450 上需要 3.3 秒,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;
}