Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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++ 初始化3d数组的快速方法(C+;+;)_C++_Performance_Multidimensional Array_Memory Management - Fatal编程技术网

C++ 初始化3d数组的快速方法(C+;+;)

C++ 初始化3d数组的快速方法(C+;+;),c++,performance,multidimensional-array,memory-management,C++,Performance,Multidimensional Array,Memory Management,在我的程序中,我需要创建一个大的3d阵列(~1GB) 我目前正在使用两个for循环初始化数组: float*** array = new float** [m_width]; for (unsigned int i = 0; i < m_width; i++) { array3d[i] = new float * [m_height]; for (unsigned int j = 0; j < m_height; j++) { array3d

在我的程序中,我需要创建一个大的3d阵列(~1GB) 我目前正在使用两个for循环初始化数组:

float*** array = new float** [m_width];

for (unsigned int i = 0; i < m_width; i++)
{
    array3d[i] = new float * [m_height];
    for (unsigned int j = 0; j < m_height; j++)
    {
        array3d[i][j] = new float[m_layers];
    }
}
float***数组=新的float**[m_宽度];
for(无符号整数i=0;i
代码运行良好,但速度非常慢。
所以我的问题是:有没有一种更快的方法来初始化/保留多维数组的内存?(几乎可以立即创建1d阵列)

我认为有两种选择:

  • 加载具有数组结构的文件
  • 使用线程进行初始化,此窗体在初始化时可能会使用更多cpu

  • 您好。

    当我想要避免多维数组初始化但想要多维数组访问时,我正在采取的一种方法是:

    #define IDX_3D(x, y, z, width, height) ((x) + (y) * (width) + (z) * (width) * (height))
    
    void main()
    {
        int width, height, depth;
        width = height = depth = 2;
        float* multi_array = new float[width * height * depth];
    
        multi_array[IDX_3D(1, 1, 1, width, height)] = 1.0f;
    }
    

    由于C++11,您可以使用以下代码:

    int array[5][5][5] = {0};
    
    这将创建一个包含125个整数(用零填充)的3d数组。 IMHO这是在堆栈上创建和初始化3d数组的最快方法(就代码行而言)

    要在堆上创建一个(使用新的),其他答案似乎是好的


    当然,之后您必须用数据填充它,这需要一些时间,但它应该可以很快被接受。

    您不是在创建3D阵列。您正在创建一个1D指针数组,每个指针指向一个1D指针数组,每个指针指向一个1D浮点数组。这在分配效率、缓存位置、访问效率等方面是完全不同的

    如果您只创建一个大小为
    width*height*depth
    的数组,并使用索引算法访问它,则效率会更高。请记住,C++中“动态数组”的拼写方法是:<代码> STD::向量< /代码>;这对您尤其重要,因为
    向量
    值初始化其所有元素(对于
    浮点
    而言,这意味着将它们初始化为
    .0f
    )。您可以轻松创建如下内容:

    class Array3d
    {
      size_t height, depth;
      std::vector<float> data;
    
    public:
      Array3d(size_t width, size_t height, size_t depth) :
        height(height),
        depth(depth),
        data(width * height * depth)
      {}
    
      float& at(size_t x, size_t y, size_t z)
      { return data[x * height * depth + y * depth + z]; }
    
      float at(size_t x, size_t y, size_t z) const
      { return data[x * height * depth + y * depth + z]; }
    };
    
    类数组3d
    {
    尺寸、高度、深度;
    std::矢量数据;
    公众:
    阵列3D(尺寸宽度、尺寸高度、尺寸深度):
    高度(高度),,
    深度(深度),
    数据(宽度*高度*深度)
    {}
    浮动和调整(尺寸x、尺寸y、尺寸z)
    {返回数据[x*高度*深度+y*深度+z];}
    以(大小x,大小y,大小z)常量浮动
    {返回数据[x*高度*深度+y*深度+z];}
    };
    
    增加更多的功能,安全检查等口味

    这要快得多的原因:

    • 关于分配:这只是对(相当昂贵的)动态分配机制的一次调用,而不是问题中的
      width*height+height+1
      调用

    • 访问时:这需要几个整数操作和一个指针解引用才能访问任何数据成员。独立数组机制需要3次顺序内存获取(计算和偏移,在那里检索指针,偏移它,检索另一个指针,…)


    您能量化“非常慢”吗?保留一个平面数组(1d)并计算访问特定元素索引的尺寸。这不是3d数组。它是指向浮点数组的指针数组。有趣的事实:最里面的数组没有初始化。将内存分配为一大块
    width*height*depth
    。如果需要将其调零(或初始化为值),则使用
    memset
    。然后索引为3d数组。这要求在编译时知道大小。请注意,OP需要创建一个“大型3d数组(~1GB)”。