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(), ...)