0

在我的程序中,我有以下双精度数组:a1、a2、...、am;b1, b2, ..., bm; c1, c2, ..., 厘米; 它们是一个类的成员,长度均为 N,其中 m 和 N 在运行时是已知的。我将它们命名为 a、b 和 c 的原因是因为它们的含义不同,这就是它们在课堂外的访问方式。我想知道为他们分配内存的最佳方法是什么。我刚在想:

1)将所有内容分配在一大块中。像.. double *ALL = new double[3*N*m] 然后有一个成员函数使用指针算术返回指向请求部分的指针。

2) 创建大小为 m*N 的二维数组 A、B 和 C。

3) 使用 std::vector?但是由于 m 在运行时是已知的,所以我需要向量的向量。

或者我使用什么并不重要?我只是想知道什么是好的一般做法。

4

3 回答 3

3

如果这三个都以某种方式链接,如果 a[i] 和 b[i] 之间有任何关系,那么它们应该都存储在一起,理想情况下,在一个结构中,用有意义和相关的名称命名它们。对于任何未来的开发人员来说,这将更容易理解,并确保默认情况下数组的长度始终正确。

这称为设计可供性,意味着对象或接口的结构在默认情况下可以按预期使用。想想以前从未见过代码的程序员如何解释其目的,含糊不清越好。

编辑

重读我意识到您可能会询问某种内存优化(?),尽管不清楚。我仍然会说使用这样的东西,一个类指针数组或结构,这取决于 N 有多大。

于 2013-05-02T17:29:03.443 回答
2

使用选项 3,向量的向量。这将使您不必担心内存管理。

然后将其隐藏在界面后面,以便您可以根据需要进行更改。

于 2013-05-02T17:29:10.357 回答
2

这在很大程度上取决于数据的使用方式。如果每个数组都是独立使用的,那么直接的方法是使用多个命名vectorvectors。

例如,如果数组一起使用a[i]并且b[i]相互关联并一起使用,那么单独的数组并不是一个真正的好方法,因为您将继续访问不同的内存区域,这可能会导致大量缓存未命中。相反,您可能希望将aand的元素聚合bstructor中class,然后再使用其中的一个vector

我认为分配大数组并提供适当的接口来访问正确的元素集没有什么大问题。但是请不要这样做new来管理您的记忆:vector即使在这种情况下也可以使用:std::vector<double> all(3*N*m);但是我不确定这是否会给您带来任何好处,因此我的其他选择之一可能更清楚其意图。

于 2013-05-02T17:29:11.867 回答