四时宝库

程序员的知识宝库

c++ 中的高维数组(c++多维数组)

2017/05/14 18:41:22

数值计算中,常常需要操作高维数组,C++ 很容易写出来占用内存多,而且速度慢的程序。

#include <iostream>using namespace std;class Video { public:

我碰到过一些真实的,代码量很大的项目,至少三次看到上面这种模式。这种方法占用内存多,速度慢。

可以用一维数组模拟高维数组。

#include <iostream>using namespace std;class Video { public:

我们看看速度

+ c++ -std=c++11 high_dim_array_1.cpp

后者快了 14 倍。

我们分析一下内存使用。对于数据来说,二者是一样的。但是第一种方案,额外存储了很多内存指针。

  1. new char***[num_of_channels];需要 10 个指针。

  2. 同样道理,宽度层,需要 10 * 1920 个指针

  3. 高度层,需要 10*1920*1080 个指针

  4. 最后一层,没有额外的指针空间,因为这些就是原始数据了。

可以看到,每个指针 8 个字节(64位机器),我们额外需要大约 160M+ 的内存,存储间接指针。

buf_[c][w][h][r] = 0.0;buf_[c*width*height*num_of_colors + w*height*num_of_colors + h*num_of_colors + r] = 0.0;

这两个相比,前者看起来更加干净。但是,我们很容易做做操作符重载

char& operator()(size_t c, size_t w, size_t h, size_t r){ return buf_[c*width*height*num_of_colors + w*height*num_of_colors + h*num_of_colors + r];

这样我们就可以使用下面的语法。

(*this)(c,w,h,r) = 0.0;

这里淡淡的吐槽一下 c++ ,(*this)[c,w,h,r] = 0.0;也许更好,可惜 c++ 的对方括号的操作符重载,只允许一个参数。

如果非要用第一种语法形式(*this)[c][w][h][r]的话,(*this)[c]返回一个对象,依次产生三个临时对象。

想要一起学习C++的可以加裙626871916,群内有各种资料满足大家

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接