在我的程序中,我需要创建一个大型 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/