matlab编码器:是时候生成一个现代c++ API了

7次浏览(过去30天)
崔
2022年11月2日
评论道: Matan银 2022年11月4日
matlab编码器产品在工业中应用非常广泛,从R2011版本开始,生成仍然主要面向C API接口(c++实际上是C的一层包装)到常见的一/二维数组,column -major,涉及内存管理分配和释放等底层操作。随着历史的发展,我们更倾向于c++ API的现代形式(c++ 11),更安全地使用智能指针、线程支持以及类似于c++的更好的安全性和便利性 用MATLAB R2017b引入c++ API 。使用旧的C API通常会导致内存管理问题,并且难以调试。
一旦我们在matlab中快速实现了我们的算法,我们经常必须在生成C/ c++代码时迭代matlab语法,并且经常必须考虑数组边界,因为在C中考虑在堆栈和堆上分配内存是特别重要的。当前生成的C代码中的数组大小可以很容易地非常大,例如。 myarray [largeNumber] 在图像处理工具箱中,再进行一次 段错误 会发生错误。这增加了许多烦人的开销,并需要花费大量精力来不断更改代码。如果生成的c++代码在新的c++ 11中会更好,比如std::vector,它不考虑数组大小限制,允许开发人员专注于算法本身。

接受的答案

Matan银
Matan银 2022年11月2日
编辑:沃尔特·罗伯森 2022年11月4日
你好,
谢谢你的反馈。我们同意!有很多机会可以利用更现代的c++特性。我已经把这些笔记传递给了MATLAB Coder开发团队,我们将继续考虑它们。
如果你没有意识到,以下几件事可能会造成不同:
MATLAB Coder不会生成调用原生c++线程api的代码,但我们在某些情况下会触发对openMP的调用。看到的:
对于智能指针,虽然MATLAB Coder不生成共享或唯一指针,但它可以在一个更现代的接口中包装动态内存分配,该接口使用名为Coder::array的包装器来保护对“new”的调用。这应该比emxArrays更安全。您可以通过将DynamicMemoryAllocationInterface设置为' c++ '来实现这一点,这应该是生成c++代码时的默认值。看到的:
你提到了大量的堆栈分配——这肯定会成为一个问题,尤其是在受限的系统中。有一个配置参数DynamicMemoryAllocationThreshold,可用于减少堆栈上可分配的最大大小变量。这是以更多地使用堆分配为代价的:
我将传递您关于这些用例的笔记,我理解为:
-使用智能指针进行动态内存分配和跟踪指针所有权
-使用std::vector存储数值数据
-使用c++ MEX API而不是C MEX API生成MEX
-使用动态内存分配,即使是当前在堆栈上分配的固定大小的数组
如果我漏了什么请告诉我,再次感谢你,
Matan
2的评论

登录评论。

更多答案(0)

类别

了解更多MATLAB编码器帮助中心而且文件交换

2022世界杯八强谁会赢?


释放

R2022b

世界杯预选赛小组名单社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!世界杯预选赛小组名单

开始狩猎!

Baidu
map