C++ 初始化3d数组的快速方法(C+;+;)
在我的程序中,我需要创建一个大的3d阵列(~1GB) 我目前正在使用两个for循环初始化数组: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
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阵列)我认为有两种选择:
您好。当我想要避免多维数组初始化但想要多维数组访问时,我正在采取的一种方法是:
#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次顺序内存获取(计算和偏移,在那里检索指针,偏移它,检索另一个指针,…)
width*height*depth
。如果需要将其调零(或初始化为值),则使用memset
。然后索引为3d数组。这要求在编译时知道大小。请注意,OP需要创建一个“大型3d数组(~1GB)”。