Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个2D阵列初始化是个坏主意吗?_C++_Multidimensional Array_Memory Management - Fatal编程技术网

C++ 这个2D阵列初始化是个坏主意吗?

C++ 这个2D阵列初始化是个坏主意吗?,c++,multidimensional-array,memory-management,C++,Multidimensional Array,Memory Management,我有一些东西需要2D数组,但为了更好的缓存性能,我宁愿它实际上是一个普通数组。这是我的想法,但我不知道这是不是一个糟糕的想法: const int XWIDTH = 10, YWIDTH = 10; int main(){ int * tempInts = new int[XWIDTH * YWIDTH]; int ** ints = new int*[XWIDTH]; for(int i=0; i<XWIDTH; i++){ ints[i] = &

我有一些东西需要2D数组,但为了更好的缓存性能,我宁愿它实际上是一个普通数组。这是我的想法,但我不知道这是不是一个糟糕的想法:

const int XWIDTH = 10, YWIDTH = 10;
int main(){
    int * tempInts = new int[XWIDTH * YWIDTH];
    int ** ints = new int*[XWIDTH];
    for(int i=0; i<XWIDTH; i++){
        ints[i] = &tempInts[i*YWIDTH];
    }
    // do things with ints
    delete[] ints[0];
    delete[] ints;
    return 0;
}
const int XWIDTH=10,YWIDTH=10;
int main(){
int*tempInts=新int[XWIDTH*YWIDTH];
整数**整数=新整数*[XWIDTH];

对于(int i=0;i我认为您在过早地进行不必要的微优化。与其担心这一点,不如用最简单的方法让程序正常工作


如果你需要一个2D数组,只需声明并使用它。减少bug和维护比任何性能提升都要划算得多,因为性能提升可能根本不存在。

这种方法的问题是容易出错。我会告诉你,将2D数组中单个元素的分配和访问封装在一个班级

class Array2D
{
private:
    /* Pointer necessary for the choosen implementation */
public:
    Array2D(unsigned int dim1, unsigned int dim2);
    ~Array2D() /* Needed, since you will be allocation memory for this class */
    double operator()(unsigned int x, unsigned int y);
}

在这种情况下,如果您觉得需要更改分配,您只能更改方法实现,保持接口完整和构造函数。它还将帮助您防止内存泄漏。

我找到了一个更好的方法。Boost有一个多维数组库:


这个想法来自。

问题是它必须是动态的,而您不能执行
newint[XWIDTH][YWIDTH];
,这将更容易处理,并且可能会改变缓存性能。主要的是,这很简单,如果它工作,至少不会造成任何影响。如果您想动态分配2D数组,只需使用a=malloc(sizeof(int*)*ROWS);for(int i=0;iX_MAX
变得越来越大,它对我的方式更加有利。有趣的是,有了gcc-O[1-3],当Y_MAX很小时,我的方法似乎得到了更好的优化(尝试
Y_MAX=1;
然后用
gcc-O3
编译),但如果X_MAX>Y_MAX,简单的方式会更好。