我在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
然后将数据复制到数组中,这些听起来并不太有希望。
答案 0 :(得分:3)
在每次迭代中使用realloc()
听起来对我来说是一个非常好的主意,原因有两个:
“听起来不是一个好主意”是人们在没有为他们的软件建立性能要求时通常会说的,他们没有根据性能要求测试他们的软件,看看是否有任何需要改进它。
realloc
方法不是每次都重新分配一个新块,而是继续扩展你的内存块,这可能是内存堆的顶部,所以它不会浪费任何时间要么遍历内存块列表,要么复制数据。如果myFunction()
分配的任何内存在返回之前被释放,则这是成立的。您可以通过查看realloc()
返回的指针来验证它,并看到它始终(或几乎总是(* 1))与您重新分配它的指针完全相同。
编辑(* 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数组类。
取决于你如何写课程,你会得到这样的结果。 (抱歉坏语法)..