我在 C
中有一个预先编写的函数,可以用数据填充一维数组,例如
int myFunction(myData **arr,...);
myData *array;
int arraySize;
arraySize = myFunction(&arr, ...);
我想使用稍微不同的参数连续调用函数n
次(n
取决于用户输入),并且我需要收集的所有数据之后是一个 C
数组。返回数组的大小并不总是固定的。哦,myFunction
在内部进行内存分配。我想以内存高效的方式执行此操作,但在每次迭代中使用 realloc
听起来并不是一个好主意。
我确实拥有所有可用的 C++
功能(该项目采用 C++
语言,仅使用 C
库),但使用 std::vector
不好,因为收集的数据随后被发送到具有类似于以下定义的函数:
void otherFunction(myData *data, int numData, ...);
有什么想法吗?我唯一能想到的就是 realloc
或使用 std::vector
并随后将数据复制到数组中,而这些听起来不太有希望。
最佳答案
在每次迭代中使用 realloc()
对我来说听起来是一个非常好的主意,原因有两个:
“听起来不是一个好主意”是人们在没有为他们的软件建立性能要求并且没有根据性能要求测试他们的软件以查看是否有任何需要时通常会说的一句话来改进它。
realloc 方法不会每次都重新分配一个新 block ,而是会简单地不断扩展内存块,该内存块可能位于内存堆的顶部,因此不会浪费时间遍历内存块列表或复制数据。只要
myFunction()
分配的任何内存在返回之前都被释放,这一点就成立。您可以通过查看realloc()
返回的指针来验证它,并看到它总是(或几乎总是 (*1))与您给它重新分配的指针完全相同。
编辑 (*1) 一些 C++ 运行时实现两个堆,一个用于小型分配,一个用于大型分配,因此,如果您的 block 在堆中分配为小块,然后它会变大,对于大块来说,有可能会被移动一次到堆中。因此,不要期望指针总是相同的;只是大部分时间。
关于c++ - 有效地将多个一维数组中的数据收集到单个一维数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8778554/