读书人

在C++中使用vector和new实现的多维数组

发布时间: 2012-03-14 12:01:12 作者: rapoo

在C++中使用vector和new实现的多维数组的效率谁高?
代码如下:
一个4维数组,用vector和new生成的数组调用时谁的效率高?关键应该是定位问题
我在Linux上测试发现vector速度快,但是我用了指针来调用的new出来的数组,为什么还是不快呢?

另外数组操作最优化的是不是应该直接用指针?但是最后一维的指针也是通过运算来定位,效率还是会掉下来

for (l=0;l <6;l++)
{
/* Sz[l] = vector <vector <vector <std::complex <double> > > > (
jmax[l]+1,
vector <vector <std::complex <double> > > (
imax[l]+1,
vector <std::complex <double> > (
freqnum+1
)));
*/

/*
Exf[l] = vector <vector <vector <std::complex <double> > > > (
jmax[l]+1,
vector <vector <std::complex <double> > > (
imax[l]+1,
vector <std::complex <double> > (
freqnum+1
)));
Eyf[l] = vector <vector <vector <std::complex <double> > > > (
jmax[l]+1,
vector <vector <std::complex <double> > > (
imax[l]+1,
vector <std::complex <double> > (
freqnum+1
)));
Ezf[l] = vector <vector <vector <std::complex <double> > > > (
jmax[l]+1,
vector <vector <std::complex <double> > > (
imax[l]+1,
vector <std::complex <double> > (
freqnum+1
)));
Hxf[l] = vector <vector <vector <std::complex <double> > > > (
jmax[l]+1,
vector <vector <std::complex <double> > > (
imax[l]+1,
vector <std::complex <double> > (
freqnum+1
)));
Hyf[l] = vector <vector <vector <std::complex <double> > > > (
jmax[l]+1,
vector <vector <std::complex <double> > > (
imax[l]+1,
vector <std::complex <double> > (
freqnum+1
)));
Hzf[l] = vector <vector <vector <std::complex <double> > > > (
jmax[l]+1,
vector <vector <std::complex <double> > > (
imax[l]+1,
vector <std::complex <double> > (
freqnum+1
)));
*/
Sz[l] = new std::complex <double> **[jmax[l]];
Exf[l] = new std::complex <double> **[jmax[l]];
Eyf[l] = new std::complex <double> **[jmax[l]];
Ezf[l] = new std::complex <double> **[jmax[l]];
Hxf[l] = new std::complex <double> **[jmax[l]];
Hyf[l] = new std::complex <double> **[jmax[l]];
Hzf[l] = new std::complex <double> **[jmax[l]];


for (j=0;j <=jmax[l];j++)
{
Sz[l][j] = new std::complex <double> *[imax[l]];
Exf[l][j] = new std::complex <double> *[imax[l]];
Eyf[l][j] = new std::complex <double> *[imax[l]];
Ezf[l][j] = new std::complex <double> *[imax[l]];
Hxf[l][j] = new std::complex <double> *[imax[l]];
Hyf[l][j] = new std::complex <double> *[imax[l]];
Hzf[l][j] = new std::complex <double> *[imax[l]];
for (i=0;i <=imax[l];i++)
{
Sz[l][j][i] = new std::complex <double> [freqnum+1];
Exf[l][j][i] = new std::complex <double> [freqnum+1];
Eyf[l][j][i] = new std::complex <double> [freqnum+1];
Ezf[l][j][i] = new std::complex <double> [freqnum+1];
Hxf[l][j][i] = new std::complex <double> [freqnum+1];
Hyf[l][j][i] = new std::complex <double> [freqnum+1];
Hzf[l][j][i] = new std::complex <double> [freqnum+1];
for (k=0;k <=freqnum;k++)
{
Sz[l][j][i][k]=0.0;
Exf[l][j][i][k]=0.0;
Eyf[l][j][i][k]=0.0;
Ezf[l][j][i][k]=0.0;
Hxf[l][j][i][k]=0.0;
Hyf[l][j][i][k]=0.0;
Hzf[l][j][i][k]=0.0;
}
}
}
}

[解决办法]
vector是标准库里的,应该比较高
[解决办法]
楼上的,给点理由好吗?
难道new不属于标准语法?
就分配而言,new肯定是要快了。如果vector也是在堆上分配的话
[解决办法]
new的效率要高,因为vector <> 的要进行下标的越界的合法性检查,并且如果下标越界的话,会抛出异常,
所以vector <> 是牺牲一点点效率的,不过这点效率在某些系统当中微不足道,但是在一些小型机当中就必须考虑了,还有就是与vector <T,alloc <T> > 效率与当中的alloc <T> 有关.
[解决办法]
vector <> 的要进行下标的越界的合法性检查,并且如果下标越界的话,会抛出异常,

operator[] 不检查,at() 要检查。
------解决方案--------------------


按照c++ primer的说法,如果你用vector <> 应该是系统自己管理内存(虽然也是外面的库,但也归 "标准库 "吧?哈哈),而你用new的时候,是需要自己去管理的,故没有vector <> 高~
[解决办法]
一个 直接 mollac (), 一个还要 用构造函数,在mollac()。
[解决办法]
个人感觉都是一个数组的话应该是new的效率比较高一些
[解决办法]
你打开vector,看operator[]的源码就知道vector比指针应该略慢,并几乎相同。
iterator begin() { return this-> _M_start; }
reference operator[](size_type __n) { return *(begin() + __n); }
全部是内联函数。
[解决办法]
呵呵,象楼主这样比价出来的数据还真不知道能说明什么。

你用new的算法跟vector使用动态申请内存的算法不一样,做的事也不一样,vector可是做了很多额外工作的,而且确保内存是连续的,内部来回拷贝了不知多少次了,这样结果怎么比较?

vector可以优化,比如定义时就声明大小,会减少很多次复制,效率也会提高一些。

建议楼主还是看看vector实现的源代码或者实现的思想,再来考虑实现效率,这样会理解的更透彻一点,也可以做到知其然的同时知其所以然。
[解决办法]
up 不懂 学习
[解决办法]
不知道楼主用的是不是SGI STL,假如是这个版本的话:

Vector的内存管理是这样的,在分配小于等于128个字节的内存的时候,采用内存池的方式,否则也是直接每次都调用C的malloc函数。

我简单说一下内存池的方式吧,假如初始化的大小是4个元素,则STL会生成8个元素的内存空间,其中的4个元素放在相应的链表中,另外4个放在内存池中。当插入第五个数的时候,会从内存池中获取而非直接分配。当插入第9个元素的时候,检查发现分配的内存不足,则会重新申请16个歹元素的内存空间,并把原来的8个元素COPY到新的空间上。同样,另外的8个元素的空间,有4个在链表中,4个在内存池中。

  简单来说是这样做的。
[解决办法]
up
[解决办法]



楼主要求的是调用时候的效率. stl调用的是[]. 这个是一个函数,函数可以内联.
而指针[]这个是一个间接操作.不知道会不会是这个问题.

只是感觉上stl内部应该也是new出来的空间,不至于有什么特别快的地方吧.
到底差别有多少?
[解决办法]
关注

读书人网 >C++

热点推荐