gpt4 book ai didi

c - 从 Matlab C mex 函数返回 C 结构中的大型数组的最有效内存方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:13 24 4
gpt4 key购买 nike

我有一个程序可以创建一个包含各种基本数据类型(整数 double 等)的大型数组的 C 结构。对于我来说,从 C mexfunction 将这些数据返回到 Matlab 的最有效内存方式是什么,同时还要确保仔细处理所有内存释放?理想情况下,我想返回整个结构,但单独返回每个数组的方法也是可以接受的。

您可能还假设我了解编写 mexfunction 和使用将数据复制到 plhs 指针指向的数组的基本方法返回参数的基础知识。据我了解,这将创建内存副本,即需要双倍内存,如果不正确请纠正我。

最佳答案

我的问题现在已经在另一个论坛上得到了回答here .以下是给出的答案:

“您不能将 native C/C++ 内存(即本地堆栈变量或分配的变量与 malloc 和表兄弟)混合到 mxArray 中以返回到 MATLAB 工作区。这最终会导致 MATLAB 在尝试释放此内存时崩溃.所以你坚持复制这段内存。在我看来,你的选择是:

1) 重写您的代码以使用 MATLAB API 函数 mxMalloc 和 cousins 而不是 native C/C++ 函数 malloc 和 friends 创建您的 C/C++ 结构。然后这个内存可以直接附加到 mxArray 结构以返回到 MATLAB 工作区......不需要复制或释放。

2) 当您逐步释放 C/C++ 内存时,使用 mxMalloc & cousins 逐步创建您的 MATLAB 结构。这仍然需要您临时复制最大的 block ,但可以避免同时复制内存中的所有内容。

3) 忽略我所说的混合原生 C/C++ 内存和 MATLAB API 内存。通过侵入 mxArray 来玩游戏以混合它们,将它们的共享数据副本保留在 mex 例程中以防止 MATLAB 尝试释放内存。这是非常棘手的,不推荐这样做,因为如果您没有正确管理所有内容,您很容易泄漏内存和/或使 MATLAB 崩溃。

与返回结构体或元胞数组相比,将多个单独的变量返回到 MATLAB 并不会为您节省大量内存,因此只需返回根据您的预期用途更容易创建和管理的内容即可。”-James Tursa

关于c - 从 Matlab C mex 函数返回 C 结构中的大型数组的最有效内存方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9379656/

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