C++ 矩阵(RAM 中的元素不是连续的)

C++ Matrix (elements in RAM not continous)

提问人:Ricardo Roel 提问时间:11/9/2023 更新时间:11/9/2023 访问量:93

问:

(这需要一些上下文,请阅读本文,然后,如果您能向我解释为什么会发生这种情况,我将感谢您的帮助)

之前的一些背景...

好的,在我的大学里,他们教我们两种用 C++ 制作矩阵的方法。

第一种方式是经典

int matrix[rows][columns];

然后,是这样的:

int** matrix = new int*[rows];
for(int i = 0; i < rows; i++)
    matrix[i] = new int[columns];

从理论上讲,这是这样工作的。

Matrix image

首先,我们创建一个向量,然后,使用 for,我们遍历向量中的每个空间以创建行,在图像中,首先我们创建绿色列,对于列中的每个数字,我们创建矩阵中的其余元素。

我们学习了如何使用指针访问矩阵中的位置等。一切正常,但是,在一个练习中,我需要对矩阵进行排序,而且,我的第一个问题是“如果矩阵像 ram 中的一个大向量,我应该像向量一样对它进行排序,但在矩阵的第一个元素中有一个指针”,(我在 c 中像这样对矩阵进行排序)。但是当我尝试使用气泡算法进行排序时,矩阵中带来了一些 RAM 垃圾,所以......几个小时后,我试图查看 RAM 和矩阵中的元素是如何分配的,使用 clion 中的调试器,我看到了这一点......

enter image description here

在这种情况下,矩阵的每一行都在连续的RAM空间中,但是,当到达新行时,RAM会无缘无故地跳到13个位置。我不是这方面的专家,因此,我以典型的方式创建了一个矩阵,以查看该矩阵是否具有连续的 RAM 位置和。

enter image description here

正如我所料,矩阵中的元素在RAM中是连续的

问题

为什么会这样?我不是编程的初学者,所以,我知道向量和矩阵应该如何工作。但是,我是低级内存管理器编程语言的乞丐(我通常使用 php、java、python、js 等,但在大学之前从未使用 c/c++)。

而且,C++ 如何知道如何在矩阵中迭代?,因为如果我们用 [i][j] 遍历矩阵可以完美地工作,如果矩阵中的元素不是连续的,C++ 怎么知道如果我们完成迭代一行,将 RAM 中的 13 个空格跳到下一行?

我感谢每一个回答,非常感谢

C++ 指针 矩阵 内存 RAM

评论

1赞 Weijun Zhou 11/9/2023
“因为如果我们用 [i][j] 遍历矩阵,效果会很好......C++如何知道,如果我们完成了迭代一行”。你先得到 ,这是一个指针,然后我们用指针来访问 。在第二种方法中,我们不仅存储元素本身,而且还存储指针,这些指针是使其工作的原因。matrix[i]pp[j]rows
1赞 Weijun Zhou 11/9/2023
根据我个人的经验,重写后理解的主要困难是,在第一种情况下引用相同的内存地址,但在第 2 种情况下有一个额外的内存地址取消引用。这让初学者感到困惑,但这正是语言的工作方式。matrix[i][j]*(*(matrix+i)+j)*(matrix+i)matrix+i
1赞 Louis Go 11/9/2023
如果您想要 2D 数组的连续内存,并且在编译时已知,请选择 .但要注意填充。std::array
1赞 Weijun Zhou 11/9/2023
stackoverflow.com/questions/1452721/......
1赞 PaulMcKenzie 11/9/2023
@RicardoRoel 请看这个答案。将创建一个连续数组,但保留语法。[][]

答:

5赞 John3136 11/9/2023 #1

int matrix[rows][columns];就像你说的那样是连续的。

int** matrix = new int*[rows];更像是

enter image description here

每次调用时,都无法保证内存的位置。在内存方面,第二行可能在第一行之前。只要您通过指针访问列,您就不在乎。new

评论

0赞 Ricardo Roel 11/9/2023
哦。在本例中,绝缘基质是 4x3 还是 4x4?因为,我知道绿色列只是指向真实矩阵(4x3 矩阵,而不是我一开始的 4x4 矩阵)的指针
1赞 Peter 11/9/2023
@RicardoRoel “绿色列”不包含“指向真实矩阵的指针”(以这种方式描述或思考它是没有意义的,并且会导致您的误解)。标记为绿色的每个元素都是一个指针,其值是动态分配的 (d) 数组(第一个元素)的地址。有四个指针,每个指针指向一个动态分配的数组(第一个元素),该数组包含三个元素。所以这代表一个 4x3 矩阵。这些 3 元素数组分别由不同的表达式生成,因此在内存中不是(必须)连续的。newnew
0赞 Red.Wave 11/9/2023
C++ 中行主矩阵的典型非稀疏实现是: .这为矩阵保留了一个可计算的连续缓冲区。可以很容易地添加访问器和修饰符,以获得所需的便利级别。 在大小(内存)管理方面具有功能范围,并且可以安全复制,以防需要深度复制。如果你想要 C++ 代码,忘记原始指针 - 直到你成为 C++ 的超级专家。坚持使用 STL,快速学习 C++。class matrix{std::size_t col; std:: vector<double> storage; public matrix (std::size_t rows, std::size_t cols): col{cols}, storage(rows*cols){};};std::vector