C++ 高效地将多个一维阵列中的数据收集到单个一维阵列中
我在C++ 高效地将多个一维阵列中的数据收集到单个一维阵列中,c++,c,memory-management,C++,C,Memory Management,我在C中有一个预先编写的函数,它用数据填充一维数组,例如 int myFunction(myData **arr,...); myData *array; int arraySize; arraySize = myFunction(&arr, ...); 我想用稍微不同的参数连续调用函数n(n取决于用户输入),然后我需要在单个C数组中收集所有数据。返回数组的大小并不总是固定的。哦,myFunction在内部进行内存分配。我想以一种节省内存的方式来实现这一点,但是在每次迭代中使用re
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
并在之后将数据复制到数组中,这些听起来不太有希望。我认为最好的解决方案是使用您需要的一些方法编写您自己的1D数组类
根据您编写类的方式,您将得到这样的结果。(抱歉语法不好)如果您知道要调用函数N次,并且返回的数组总是M长,那么为什么不首先分配一个数组M*N?或者,如果您不知道M或N中的一个,则设置最坏情况下的最大值。或者M和N都依赖于用户输入吗 然后,更改调用用户输入获取函数的方式,使传递给它的数组指针实际上是该大数组的偏移量,以便它将数据存储在正确的位置。然后,下一次迭代,进一步偏移,然后再次调用。在每次迭代中使用
realloc()
对我来说是一个非常好的主意,原因有两个:
realloc
方法不会每次重新分配一个新的块,而是简单地继续扩展内存块,它可能位于内存堆的顶部,因此它不会浪费任何时间遍历内存块列表或复制数据。如果myFunction()
分配的内存在返回之前被释放,则这一点成立。您可以通过查看realloc()
返回的指针来验证它,并查看它始终(或几乎总是(*1))与您给它重新分配的指针完全相同<> > >编辑< /St>(* 1)一些C++运行时实现两个堆,一个用于小分配,一个用于大分配,因此如果块在堆中分配给小块,然后它变大,则有可能将它移动到堆的堆中。因此,不要期望指针总是相同的;大部分时间都是这样。只需将所有数据复制到一个
std::vector
。您可以使用调用向量v
上的otherFunction
otherFunction(&v[0], v.size(), ...)
或
至于您的效率要求:在我看来,您的优化似乎过早。首先尝试这个选项,然后测量它有多快,如果它真的太慢,只寻找其他解决方案。thnx获得快速回复。不幸的是,我不能使用自己的1D array类-我使用的函数来自现有的库,它们只能与
myData*
结合使用int n
-数据数组的大小。但是,即使我编写了自己的类,我仍然需要处理相同的问题来处理类方法,而不需要实现一维数组类。标准图书馆里有一个;它叫做std::vector
,vector
很好,因为它连续存储数据,您可以将data()
传递给C函数。根据我所读的内容,我将尝试使用std::vector::data()
,它看起来像是最简单的方法:)@Kerrek SB我尝试使用std::vector::data())
函数,它与所有需要mydData*
的函数完美配合。如果你愿意写下你的评论作为回答,我会接受。我认为@larsmans已经发布了基本相同的内容,所以如果你愿意,你可以接受他的回答…@KerrekSB好的,我会接受他的回答,但我会补充一点关于data()
函数的内容,因为阅读这篇文章才是真正有用的:)非常正确,但是使用<代码> ReLoC/实际上是个坏主意,因为这是一个C++程序。使用std::vector
是一个更好的主意。realloc
可能会继续扩展。或者它可能每次都复制它。realloc()
很可能会继续扩展。无论如何,我为佩内洛普提供了一种验证realloc功能的方法。因此,如果它不继续扩大,她可以放弃这个想法。但是在任何情况下,如果她更喜欢std::vector
,并且她实际上可以使用std::vector
,那么我认为这是个好主意,所以我通过了。我刚才提到了realloc
,因为我认为std::vector
不是一个选项,因为它需要修改MyFunction()
。我只是编辑了我的问题,事先不知道N或M。而且,我不能更改输入获取函数,因为它来自一个预先存在的C
库(我不是作者)
otherFunction(v.data(), v.size(), ...)