多维数组作为class成员在堆上分配
Multi-dimensional array as a class member to be allocated on the heap
我正在为我的学士论文编写一个模拟程序,我不是 C++ 专家,在搜索了相当长一段时间后没有找到一个方便的答案或问题,就此而言,我求助于你伙计们。
我的问题如下。我有一些 class 有几个成员字段 num_a
和 num_b
除了其他可以存储在堆栈上的字段。现在这两个值的大小大致为 1000-2000。我现在需要的是 SampleClass
的另一个 class 成员,即大小为 num_a
* num_b
的二维布尔数组。由于它的大小,它需要在堆上分配。它需要在内存中是连续的,所以存储指向数组指针的指针对我来说不起作用。
SampleClass : Object {
public:
uint16_t num_a;
uint16_t num_b;
??? // some data structure for my 2d array
// simple constructor
SampleClass(num_a, num_b);
}
我在头文件 .h
中声明我的 classes 并在源文件 .cc
中实现函数和构造函数。
如您所见,num_a
和 num_b
的值都不是预先确定的,因此也不是 const
。我的问题是,我如何(以简单的方式)在头文件中声明这个东西,以及如何在源文件中的构造函数中初始化它?
我发现使用矢量的东西如下:
// header file
std::vector<std::vector<bool>> *coverage_matrix;
// source file
coverage_matrix = new std::vector<std::vector<bool>>();
coverage_matrix->push_back(something); // do something with it
最后一种方法是否有效,更重要的是,它是否与不依赖 std::vector
的解决方案一样有效?
感谢您的回答。
2-dimensional ... array ... of size num_a * num_b
... Due to its size, it needs to be alloacted on the heap. It needs to be contiguous in memory
std::vector<std::vector<bool>>
在向量的向量中,行本身是连续的,但彼此不相关。这与指针数组相同。因此,这不能满足您对连续布局的需求。
new std::vector<std::vector<bool>>()
几乎不需要像这样动态分配向量。为了正确性和性能,最好避免使用。
分配动态大小的连续数组的唯一解决方案是分配一个一维数组,其中行是一个接一个地排列。例如:
std::vector<bool> matrix(num_a * num_b);
您可以访问索引 a + num_a * b
处的元素 [a][b]。
请注意,std::vector<bool>
非常特殊,与其他向量不同。它不包含任何 bool
对象,而是将位打包,并通过屏蔽和移位 1 进行访问。这使得数据结构对缓存非常友好,但操作更加复杂。这对性能是好是坏取决于你用它做什么以及 CPU 架构。
比性能考虑更重要的是,这意味着您可以依赖其他数组的一些保证不适用于 std::vector<bool>
。例如,你不能取一个元素的地址,也不能在不同步的情况下在不同的线程中修改不同的元素。关于你的特殊情况,因为不能保证 bool 对象,当然不能保证向量中有连续的 bool 对象。
因此,如果您需要 bool
的常规数组,则在使用向量时需要解决专业化问题。例如:
enum boolean : bool {no, yes};
std::vector<boolean> matrix;
1 从技术上讲,不保证任何特定的表示。它是实现定义的。
我正在为我的学士论文编写一个模拟程序,我不是 C++ 专家,在搜索了相当长一段时间后没有找到一个方便的答案或问题,就此而言,我求助于你伙计们。
我的问题如下。我有一些 class 有几个成员字段 num_a
和 num_b
除了其他可以存储在堆栈上的字段。现在这两个值的大小大致为 1000-2000。我现在需要的是 SampleClass
的另一个 class 成员,即大小为 num_a
* num_b
的二维布尔数组。由于它的大小,它需要在堆上分配。它需要在内存中是连续的,所以存储指向数组指针的指针对我来说不起作用。
SampleClass : Object {
public:
uint16_t num_a;
uint16_t num_b;
??? // some data structure for my 2d array
// simple constructor
SampleClass(num_a, num_b);
}
我在头文件 .h
中声明我的 classes 并在源文件 .cc
中实现函数和构造函数。
如您所见,num_a
和 num_b
的值都不是预先确定的,因此也不是 const
。我的问题是,我如何(以简单的方式)在头文件中声明这个东西,以及如何在源文件中的构造函数中初始化它?
我发现使用矢量的东西如下:
// header file
std::vector<std::vector<bool>> *coverage_matrix;
// source file
coverage_matrix = new std::vector<std::vector<bool>>();
coverage_matrix->push_back(something); // do something with it
最后一种方法是否有效,更重要的是,它是否与不依赖 std::vector
的解决方案一样有效?
感谢您的回答。
2-dimensional ... array ... of size
num_a * num_b
... Due to its size, it needs to be alloacted on the heap. It needs to be contiguous in memorystd::vector<std::vector<bool>>
在向量的向量中,行本身是连续的,但彼此不相关。这与指针数组相同。因此,这不能满足您对连续布局的需求。
new std::vector<std::vector<bool>>()
几乎不需要像这样动态分配向量。为了正确性和性能,最好避免使用。
分配动态大小的连续数组的唯一解决方案是分配一个一维数组,其中行是一个接一个地排列。例如:
std::vector<bool> matrix(num_a * num_b);
您可以访问索引 a + num_a * b
处的元素 [a][b]。
请注意,std::vector<bool>
非常特殊,与其他向量不同。它不包含任何 bool
对象,而是将位打包,并通过屏蔽和移位 1 进行访问。这使得数据结构对缓存非常友好,但操作更加复杂。这对性能是好是坏取决于你用它做什么以及 CPU 架构。
比性能考虑更重要的是,这意味着您可以依赖其他数组的一些保证不适用于 std::vector<bool>
。例如,你不能取一个元素的地址,也不能在不同步的情况下在不同的线程中修改不同的元素。关于你的特殊情况,因为不能保证 bool 对象,当然不能保证向量中有连续的 bool 对象。
因此,如果您需要 bool
的常规数组,则在使用向量时需要解决专业化问题。例如:
enum boolean : bool {no, yes};
std::vector<boolean> matrix;
1 从技术上讲,不保证任何特定的表示。它是实现定义的。