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

标签 c++ c memory-management

我在 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/

相关文章:

c - 发送指向函数的指针

c - 为什么系统调用 read() 在使用用户输入时不起作用

javascript - jQuery 顺序元素、删除、分离、克隆、追加内存泄漏

c++ - 使用WIC(Windows镜像组件)时遇到的问题

c - 为什么 C 中没有内置的 swap 函数,而 Assembly 中有 xchg?

memory-management - Core Foundation 对象是由 ARC 自动释放还是需要手动内存管理?

C 动态内存与堆栈内存变量

c++ - Waf 生成 Visual Studio 项目?

c++ - 如何检测Windows 2012 Core 版(C++)

c++ - boost python optional 引发错误