主要内容gydF4y2Ba

使用类接口生成c++代码gydF4y2Ba

当你生成C代码时,软件会分析你的MATLABgydF4y2Ba®gydF4y2Ba代码并生成对应于您的MATLAB函数的入口点C函数。在生成c++代码时,可以选择将入口点函数生成为c++类中的方法。使用此选项:gydF4y2Ba

  • 您将获得更多面向对象的代码。gydF4y2Ba

  • 代码生成器生成自动执行内存初始化和终止的类构造函数和析构函数。gydF4y2Ba

  • 为每个类实例分别分配内存。每个类实例的方法都是线程安全且可重入的。gydF4y2Ba

  • 多个入口点函数成为单个c++类中的方法。gydF4y2Ba

类接口可以从命令行或gydF4y2BaMATLAB编码器™gydF4y2Ba在命令行中,使用gydF4y2BaCppInterfaceStylegydF4y2Ba而且gydF4y2BaCppInterfaceClassNamegydF4y2Ba配置参数。从应用程序,在gydF4y2Ba生成代码gydF4y2Ba步骤中,选择gydF4y2Ba语言gydF4y2Ba作为gydF4y2Bac++gydF4y2Ba中,选择gydF4y2Ba界面风格gydF4y2Ba作为gydF4y2Ba方法gydF4y2Ba,然后指定gydF4y2Bac++接口类的名称gydF4y2Ba.gydF4y2Ba

这些示例展示了命令行工作流。gydF4y2Ba

生成带有类接口的c++代码gydF4y2Ba

这个例子展示了生成的c++代码在使用类接口时的不同之处。gydF4y2Ba

MATLAB算法gydF4y2Ba

考虑一个简单的MATLAB函数,它对矩阵执行运算并输出结果。gydF4y2Ba

函数gydF4y2BaOut = fooggydF4y2Ba% # codegengydF4y2BaI = eye(447);out = ones(447)*I + 7;gydF4y2Ba

生成带有或不带有类接口的c++代码gydF4y2Ba

要生成带有类接口的c++代码,请使用gydF4y2BaCppInterfaceStylegydF4y2Ba而且gydF4y2BaCppInterfaceClassNamegydF4y2Ba参数。对象中存储输出gydF4y2BawithClassgydF4y2Ba文件夹中。gydF4y2Ba

CFG = code .config(gydF4y2Ba“自由”gydF4y2Ba);cfg。GenCodeOnly = true;cfg。TargetLang =gydF4y2Ba“c++”gydF4y2Ba;cfg。CppInterfaceStyle =gydF4y2Ba“方法”gydF4y2Ba;cfg。CppInterfaceClassName =gydF4y2Ba“myClass”gydF4y2Ba;codegengydF4y2BafooggydF4y2Ba配置gydF4y2BacfggydF4y2Ba报告gydF4y2Ba- dgydF4y2BawithClassgydF4y2Ba
要查看报告,打开('withClass/html/report.mldatx')gydF4y2Ba

接下来,创建一个新的配置对象并生成不使用类接口的c++代码。gydF4y2Ba

CFG = code .config(gydF4y2Ba“自由”gydF4y2Ba);cfg。GenCodeOnly = true;cfg。TargetLang =gydF4y2Ba“c++”gydF4y2Ba;codegengydF4y2BafooggydF4y2Ba配置gydF4y2BacfggydF4y2Ba报告gydF4y2Ba- dgydF4y2BawithoutClassgydF4y2Ba
要查看报告,打开('withoutClass/html/report.mldatx')gydF4y2Ba

检查生成的示例主函数。比较使用类接口和不使用类接口的版本。使用类接口,主函数将入口点函数作为类方法调用。gydF4y2Ba

类型gydF4y2BawithClass / / main.cpp例子gydF4y2Ba

生成代码中的类定义和实现gydF4y2Ba

当代码生成器为c++接口类生成代码时,它确保函数方法是可重入的。如果函数方法使用的变量可能超过本地堆栈内存限制,则由配置参数设置gydF4y2BaStackUsageMaxgydF4y2Ba,然后代码生成器为变量生成私有数据结构(由后缀gydF4y2BaStackDatagydF4y2Ba),而不是将变量声明为gydF4y2Ba静态gydF4y2Ba.静态变量在函数调用之间保持不变,并且不可重入。有关生成可重入C代码的信息,请参见gydF4y2Ba生成和调用可重入代码gydF4y2Ba.gydF4y2Ba

要查看生成的类实现,请修改函数gydF4y2BafooggydF4y2Ba使其包含的变量超过配置参数指定的最大堆栈使用量gydF4y2BaStackUsageMaxgydF4y2Ba.gydF4y2Ba

函数gydF4y2Baout = foogBiggydF4y2Ba% # codegengydF4y2BaI = eye(448);out = ones(448)*I + 7;gydF4y2Ba

的默认值gydF4y2BaStackUsageMaxgydF4y2Ba字节为:gydF4y2Ba

cfg。StackUsageMaxgydF4y2Ba
Ans = int32 200000gydF4y2Ba

因为gydF4y2BafooBiggydF4y2Ba使用448^2(200704)个元素的变量,代码生成器生成一个8位整数数组来表示变量,默认堆栈使用限制超过704字节。为gydF4y2BafoogBiggydF4y2Ba.gydF4y2Ba

CFG = code .config(gydF4y2Ba“自由”gydF4y2Ba,gydF4y2Ba“是”gydF4y2Ba、假);cfg。GenCodeOnly = true;cfg。TargetLang =gydF4y2Ba“c++”gydF4y2Ba;cfg。CppInterfaceStyle =gydF4y2Ba“方法”gydF4y2Ba;cfg。CppInterfaceClassName =gydF4y2Ba“myBigClass”gydF4y2Ba;codegengydF4y2BafoogBiggydF4y2Ba配置gydF4y2BacfggydF4y2Ba报告gydF4y2Ba- dgydF4y2BawithBigClassgydF4y2Ba
要查看报告,打开('withBigClass/html/report.mldatx')gydF4y2Ba

检查生成的接口类定义gydF4y2Ba

类的类定义gydF4y2BafoogBiggydF4y2Ba项目及用途gydF4y2BafooggydF4y2Ba.的gydF4y2BafoogBiggydF4y2Ba类在私有类属性中存储可以超过最大堆栈使用量的变量,而gydF4y2BafooggydF4y2Ba类只在堆栈上创建局部变量。gydF4y2Ba

类定义中包含gydF4y2BaStackDatagydF4y2Ba结构,指示该类需要超过本地堆栈使用限制的数据,然后通过使用为类实例分配堆内存gydF4y2Ba新gydF4y2Ba.有关示例的生成代码,请参阅生成的示例主文件。gydF4y2Ba

生成的c++类中的全局变量和持久化gydF4y2Ba

当生成带有类接口的c++代码时,可以将全局变量和持久化变量作为类的成员访问。这个例子展示了如何与类中的全局变量和持久化变量交互。gydF4y2Ba

MATLAB算法gydF4y2Ba

考虑一个MATLAB函数,它使用全局变量和持久变量记录调用它的次数。gydF4y2Ba

函数gydF4y2Ba[po,go] = countCallsgydF4y2Ba% # codegengydF4y2Ba%增量持久和全局变量gydF4y2Ba持续的gydF4y2BapgydF4y2Ba全球gydF4y2BaggydF4y2Ba如果gydF4y2BaIsempty (p) p = 0;gydF4y2Ba结束gydF4y2BaP = P +1;G = G +1;gydF4y2Ba%设置输出变量gydF4y2BaPo = double(p);Go = double(g);gydF4y2Ba

生成带有类接口的c++代码gydF4y2Ba

对于代码生成,在工作区中初始化全局变量。gydF4y2Ba

全球gydF4y2Bag;G = 0;gydF4y2Ba

生成类中的代码gydF4y2BacountClassgydF4y2Ba.gydF4y2Ba

CFG = code .config(gydF4y2Ba“自由”gydF4y2Ba);cfg。GenCodeOnly = true;cfg。TargetLang =gydF4y2Ba“c++”gydF4y2Ba;cfg。CppInterfaceStyle =gydF4y2Ba“方法”gydF4y2Ba;cfg。CppInterfaceClassName =gydF4y2Ba“countClass”gydF4y2Ba;codegengydF4y2BacountCallsgydF4y2Ba配置gydF4y2BacfggydF4y2Ba报告gydF4y2Ba
要查看报告,打开('codegen/lib/countCalls/html/report.mldatx')gydF4y2Ba

检查类定义gydF4y2Ba

在生成的c++代码中,初始化函数将全局变量设置为您在工作空间中指定的值。属性指定初始全局值gydF4y2Bacodegen全局gydF4y2Ba语法。gydF4y2Ba

检查头文件中的类定义代码gydF4y2BacountClass.hgydF4y2Ba.gydF4y2Ba

类型gydF4y2Bacodegen / lib / countCalls / countClass.hgydF4y2Ba

全局变量是类的公共成员。根据需要从主函数访问这个变量。持久变量存储在私有类数据结构中。gydF4y2Ba

将多个入口点函数放在同一个类中gydF4y2Ba

当您为多个入口点函数生成c++代码并使用类接口设置时,每个函数都将成为同一个类的公共方法。您可以使用此技术为多个入口点函数项目创建一个更简单的接口。gydF4y2Ba

MATLAB入门点函数gydF4y2Ba

打破函数gydF4y2BacountCallsgydF4y2Ba在前面的例子中,分为两个,以便一个函数使用持久变量计数调用,另一个函数使用全局变量计数调用。检查这两个功能。gydF4y2Ba

函数gydF4y2Bapo = countPersistentgydF4y2Ba% # codegengydF4y2Ba%增量持久变量gydF4y2Ba持续的gydF4y2BapgydF4y2Ba如果gydF4y2BaIsempty (p) p = 0;gydF4y2Ba结束gydF4y2BaP = P +1;gydF4y2Ba%设置输出变量gydF4y2BaPo = double(p);gydF4y2Ba
函数gydF4y2Bago = countGlobalgydF4y2Ba% # codegengydF4y2Ba增量全局变量gydF4y2Ba全球gydF4y2BaG G = G +1;gydF4y2Ba%设置输出变量gydF4y2BaGo = double(g);gydF4y2Ba

生成c++代码gydF4y2Ba

使用gydF4y2BacodegengydF4y2Ba命令并指定初始全局变量值作为输入。gydF4y2Ba

CFG = code .config(gydF4y2Ba“自由”gydF4y2Ba);cfg。GenCodeOnly = true;cfg。TargetLang =gydF4y2Ba“c++”gydF4y2Ba;cfg。CppInterfaceStyle =gydF4y2Ba“方法”gydF4y2Ba;cfg。CppInterfaceClassName =gydF4y2Ba“countClassMulti”gydF4y2Ba;codegengydF4y2BacountGlobalgydF4y2BacountPersistentgydF4y2Ba配置gydF4y2BacfggydF4y2Ba报告gydF4y2Ba全局变量gydF4y2Ba{' g ', 0}gydF4y2Ba
要查看报告,请打开('codegen/lib/countGlobal/html/report.mldatx')gydF4y2Ba

检查生成的代码gydF4y2Ba

要查看生成的类定义,请打开gydF4y2BacountClassMulti.hgydF4y2Ba.每个入口点函数都是类的一个公共方法。gydF4y2Ba

类型gydF4y2Bacodegen / lib / countGlobal / countClassMulti.hgydF4y2Ba

另请参阅gydF4y2Ba

相关的话题gydF4y2Ba