Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 连续分配大数据是否有好处?_C++ - Fatal编程技术网

C++ 连续分配大数据是否有好处?

C++ 连续分配大数据是否有好处?,c++,C++,在我的程序中,我有以下双数组: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的二维阵列A、B和C 3) 使用std:

在我的程序中,我有以下双数组: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的二维阵列A、B和C

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


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

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

这被称为设计启示,意味着一个对象或接口的结构在默认情况下可以按预期使用。试想一下,一个从未见过代码的程序员会如何解释它的用途,歧义越少越好

编辑


重读一遍,我意识到你可能会问一些关于内存优化的问题(?),尽管还不清楚。我还是要说使用类似的东西,或者是类指针数组,或者是结构数组,这取决于N的大小。

使用选项3,一个向量向量。这将使您不再担心内存管理


然后将其隐藏在界面后面,以便在需要时进行更改。

这在很大程度上取决于数据的使用方式。如果每个数组都是独立使用的,那么简单的方法就是使用一些命名的
向量
s或
向量
s

如果数组一起使用,例如
a[i]
b[i]
相互关联并一起使用,那么单独的数组并不是一个好方法,因为您将不断访问内存的不同区域,这可能会导致大量缓存未命中。相反,您希望将
a
b
的元素聚合到
struct
class
中,然后拥有这些聚合的单个
向量


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

让我指出,如果您有表示“许多不同事物”的数组,那么这是一种设计味道(并不总是很糟糕)。@MarkB我认为OP意味着不同的数组(
a_k
vs.
b_k
vs.
c_k
)意味着不同的东西(我希望
a
b
c
只是这个问题的傀儡),而不是一个数组在不同的情况下意味着不同的东西。@Danielf相信你是对的。a、b和c都是傀儡名称。