有效地将多个1-D阵列中的数据收集到单个1-D阵列中

时间:2012-01-08 15:03:07

标签: c++ c memory-management

我在C中有一个预先写好的函数,用数据填充一维数组,例如

int myFunction(myData **arr,...);


myData *array;
int arraySize;
arraySize = myFunction(&arr, ...);

我想连续调用函数n,参数略有不同(n依赖于用户输入),我需要在一个{{1}中收集所有数据之后的数组。返回的数组的大小并不总是固定的。哦,C在内部进行内存分配。我希望以一种以内存效率的方式执行此操作,但在每次迭代中使用myFunction听起来不是一个好主意。

我确实拥有所有realloc功能(项目位于C++,只使用C++库),但使用C并不好,因为收集了稍后将数据发送到具有类似于:

的定义的函数
std::vector

有什么想法吗?只有我能想到的是void otherFunction(myData *data, int numData, ...); 或使用realloc然后将数据复制到数组中,这些听起来并不太有希望。

4 个答案:

答案 0 :(得分:3)

在每次迭代中使用realloc()听起来对我来说是一个非常好的主意,原因有两个:

  1. “听起来不是一个好主意”是人们在没有为他们的软件建立性能要求时通常会说的,他们没有根据性能要求测试他们的软件,看看是否有任何需要改进它。

  2. realloc方法不是每次都重新分配一个新块,而是继续扩展你的内存块,这可能是内存堆的顶部,所以它不会浪费任何时间要么遍历内存块列表,要么复制数据。如果myFunction()分配的任何内存在返回之前被释放,则这是成立的。您可以通过查看realloc()返回的指针来验证它,并看到它始终(或几乎总是(* 1))与您重新分配它的指针完全相同。

  3. 编辑(* 1)一些C ++运行时实现两个堆,一个用于小分配,一个用于大分配,因此如果块在堆中分配用于小块,然后它会变大,有可能它会被移动一次到大块的堆。所以,不要指望指针始终是相同的;只是大部分时间。

答案 1 :(得分:1)

如果您知道要调用该函数N次,并且返回的数组总是M长,那么为什么不最初只分配一个数组M * N?或者,如果您不知道M或N中的一个,则设置最差情况下的最大值。或者M和N都依赖于用户输入?

然后,更改调用用户输入获取函数的方式,以便传递它的数组指针实际上是该大数组的偏移量,以便将数据存储在正确的位置。然后,下一次迭代,进一步偏移,然后再次调用。

答案 2 :(得分:1)

只需将所有数据复制到std::vector即可。您可以使用

在向量otherFunction上调用v
otherFunction(&v[0], v.size(), ...)

otherFunction(v.data(), v.size(), ...)

至于你的效率要求:它让我觉得你过早地进行了优化。首先尝试这个选项,然后测量它的速度,只有在它真的太慢时才寻找其他解决方案。

答案 3 :(得分:-1)

我认为最好的解决方案是使用您需要的一些方法编写自己的1D数组类。

取决于你如何写课程,你会得到这样的结果。 (抱歉坏语法)..