c加加中 的高維數組
2017/05/14 18:41:22
數值計算中,常常需要操作高維數組,C++ 很容易寫出來佔用內存多,而且速度慢的程序。
#include using namespace std;class Video { public:
我碰到過一些真實的,代碼量很大的項目,至少三次看到上面這種模式。這種方法佔用內存多,速度慢。
可以用一維數組模擬高維數組。
#include using namespace std;class Video { public:
我們看看速度
+ c++ -std=c++11 high_dim_array_1.cpp
後者快了 14 倍。
我們分析一下內存使用。對於數據來說,二者是一樣的。但是第一種方案,額外存儲了很多內存指針。
new char***[num_of_channels];
需要 10 個指針。
同樣道理,寬度層,需要 10 * 1920 個指針
高度層,需要 10*1920*1080 個指針
最後一層,沒有額外的指針空間,因為這些就是原始數據了。
可以看到,每個指針 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++ ,
也許更好,可惜 c++ 的對方括弧的操作符重載,只允許一個參數。
如果非要用第一種語法形式
(*this)[c][w][h][r]
的話,
(*this)[c]
返回一個對象,依次產生三個臨時對象。
想要一起學習C++的可以加裙六二六八七一九一六,裙內有各種資料滿足大家,歡迎加裙
※C語言-掃雷遊戲加強版本
※C語言中動態數組的實現
※C語言學習中必不可少的循環嵌套
※C語言-搶火車票軟體原理及筆記,大神執筆值得分享
※C語言代碼訓練 精講
TAG:C加加 |