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

标签 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[i][j] = new float[m_layers];
    }
}

代码运行良好,但速度很慢。 所以我的问题是:是否有更快的方法来为多维数组初始化/保留内存? (几乎可以立即创建一维数组)

最佳答案

您不是在创建 3D 阵列。您正在创建一个一维指针数组,每个指针指向一个一维指针数组,每个指针指向一个一维 float 数组。这在分配效率、缓存局部性、访问效率等方面完全不同。

如果您只创建一个大小为 width * height * depth 的数组,并使用索引算法来访问它,效率会更高。请记住,在 C++ 中拼写“动态数组”的标准方式是 std::vector;这对您来说尤其重要,因为 vector 值初始化它的所有元素(对于 float 意味着将它们初始化为 .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]; }
};

添加更多功能、安全检查等。

为什么这样快得多的原因:

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

  • 关于访问:这需要一些整数运算和一个指针取消引用才能访问任何数据成员。分离数组机制需要 3 次顺序内存提取(计算和偏移,在那里检索指针,偏移它,检索另一个指针,...)。

关于c++ - 初始化 3d 数组的快速方法 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46912642/

相关文章:

c++ - 有没有办法定义 "alternate"字符串终止符(除了空终止符,\0)

c++ - 将很多符号表达式从 x^2 或 x^3 转换为 pow(x,n)

arrays - 是否可以使用 SIMD 对 C 中的非平凡循环进行矢量化? (复用一个输入的多长度 5 double 点积)

performance - 如何加速 Elasticsearch 恢复?

linux - 如何使用 "top"仅提取 CPU 使用率和进程名称(命令)列?

java - 在多维数组中实现 Rook 逻辑

php - 如何在php中获取两个多维数组的差异?

创建一个指向二维数组的指针

c++ - 如何以结构体为键将值输入到映射中?

c++ - 绕过 C++ 中的复制语义