gpt4 book ai didi

c++ - 高效地将多个一维数组中的数据收集到一个一维数组中

转载 作者:搜寻专家 更新时间:2023-10-31 01:16:47 24 4
gpt4 key购买 nike

我有一个用 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() 是一个非常好的主意,原因有二:

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

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

编辑 (*1) 一些 C++ 运行时实现两个堆,一个用于小分配,一个用于大分配,所以如果你的 block 在堆中分配给小块,然后它变大,对于大块,它有可能被移动一次到堆中。所以,不要指望指针总是相同的;大多数时候。

关于c++ - 高效地将多个一维数组中的数据收集到一个一维数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8778554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com