在我的程序中,我有以下数组的double:a1,a2,...,am; b1,b2,...,bm; c1,c2,...,cm;它们是一个类的成员,全长为N,其中m和N在运行时是已知的。我将它们命名为a,b和c的原因是因为它们意味着不同的东西,这就是它们在课堂外的访问方式。我想知道为他们分配内存的最佳方法是什么。我在想:
1)将所有内容分配到一个大块中。类似于.. double * ALL = new double [3 * N * m]然后有一个成员函数使用指针算法返回指向所请求部分的指针。
2)创建尺寸为m * N的2D阵列A,B和C.
3)使用std :: vector?但由于m在运行时是已知的,所以我需要矢量矢量。
或者我用的是什么并不重要?我只是想知道什么是一个很好的通用做法。
答案 0 :(得分:3)
如果所有三个都以某种方式链接,如果[i]和b [i]之间存在任何关系,那么它们应该全部存储在一起,理想情况下是在一个用有意义且相关的名称命名它们的结构中。对于任何未来的开发人员来说,这将更容易理解,并确保默认情况下数组的长度始终是正确的。
这称为设计可供性,这意味着对象或接口的结构有助于在默认情况下按预期使用。试想一下,之前从未见过代码的程序员如何解释其目的,模糊性越低越好。
修改
重读我意识到你可能会询问某种内存优化(?),虽然目前尚不清楚。我仍然会说使用类似这样的东西,无论是类指针还是结构数组,都取决于N的大小。
答案 1 :(得分:2)
使用选项3,矢量矢量。这将使您免于担心内存管理。
然后将其隐藏在界面后面,以便在您认为有需要时进行更改。
答案 2 :(得分:2)
这在很大程度上取决于数据的使用方式。如果每个数组都是独立使用的,那么简单的方法就是vector
s的一些名为vector
的。{/ p>
如果数组一起使用,例如a[i]
和b[i]
相关并且一起使用,则单独的数组并不是一个好方法,因为你将继续访问不同的内存区域,这可能导致很多缓存未命中。相反,您可能希望将a
和b
的元素一起聚合到struct
或class
中,然后只有vector
个聚合。
我没有看到分配大数组并提供适当的接口来访问正确的元素集的大问题。但是请不要使用new
来管理你的记忆:即使在这种情况下也使用vector
:std::vector<double> all(3*N*m);
但是我不确定这会给你带来什么选择可能更清楚。