代码生成处理对象的限制

代码生成静态确定处理对象的寿命。当您使用手柄对象,这种静态分析有一定的限制。

静态分析所生成的代码可以复用存储器而不是依赖于动态存储器管理方案,诸如引用计数或垃圾收集。代码生成器可避免动态存储器分配和运行时自动存储器管理。这些生成的代码特性对于某些安全关键和实时应用很重要。

对于限制,请参见:

代码生成器分析所有变量是否在使用前定义。未定义的变量或数据类型的代码生成期间导致错误。在某些情况下,代码生成器无法确定是否被定义来处理对象的引用。看到引用处理的对象可以显示未定义

外回路可能的变指的不是一个句柄对象创建在循环中

考虑手柄类mycls和功能usehandle1。代码生成报告错误,因为p,这是外循环,具有指一个属性mycls对象在循环内创建的。

classdefmycls <手柄性能支柱结束结束
功能usehandle1 P = mycls;对于I = 1:10 p.prop = mycls;结束

句柄对象,一个持久变量指向必须是一个Singleton对象

如果一个持久变量是指处理对象,代码生成器,方便程序的生命周期中只有一个实例对象。该对象必须是一个独生子目的。要创建一个单独处理对象,即在创建对象的封装声明如果的isEmpty()后卫持久变量。

例如,考虑类mycls和功能usehandle2。代码生成报告的错误usehandle2因为p.propmycls反对的声明内= mycls创建。此语句创建mycls对象的每个调用usehandle2

classdefmycls <手柄性能支柱结束结束
功能usehandle2(x)的断言(ISA(X,'双'));一贯磷;内= mycls;inner.prop = X;如果的isEmpty(P)P = mycls;p.prop =内;结束

如果移动报表内= myclsinner.prop = X在 - 的里面如果的isEmpty()后卫,代码生成成功。该声明内= mycls该程序的生命周期内执行一次。

功能usehandle2(x)的断言(ISA(X,'双'));一贯磷;如果的isEmpty(P)内= mycls;inner.prop = X;P = mycls;p.prop =内;结束

考虑函数usehandle3。代码生成报告的错误usehandle3由于持续的变量pmycls反对的声明MyObj中= mycls创建。此语句创建mycls对象的每个调用usehandle3

功能usehandle3(x)的断言(ISA(X,'双'));MyObj中= mycls;myobj.prop = X;doinit(MyObj中);DISP(myobj.prop);功能doinit(OBJ)一贯磷;如果的isEmpty(P)P = OBJ;结束

如果您MyObj中执着而附上的声明MyObj中= mycls内部的如果的isEmpty()后卫,代码生成成功。该声明MyObj中= mycls该程序的生命周期内执行一次。

功能usehandle3(x)的断言(ISA(X,'双'));一贯MyObj中;如果的isEmpty(MyObj中)MyObj中= mycls;结束doinit(MyObj中);功能doinit(OBJ)一贯磷;如果的isEmpty(P)P = OBJ;结束

引用处理的对象可以显示未定义

考虑函数refHandle该副本的句柄对象的属性到另一个对象。该功能使用一个简单的句柄类和价值类。在MATLAB®,函数运行没有错误。

功能[OUT1,OUT2,OUT3] = refHandle()X = myHandleClass;Y = X;V = myValueClass();v.prop = X;x.prop = 42;OUT1 = x.prop;OUT2 = y.prop;OUT3 = v.prop.prop;结束
classdefmyHandleClass <手柄性能支柱结束结束
classdefmyValueClass性能支柱结束结束

在代码生成期间,将发生错误:

物业“v.prop.prop”未定义一些执行路径。

三个变量引用相同的存储位置:Xÿv.prop。代码生成器确定x.propy.prop共享相同的值。代码生成器无法确定该手柄对象属性v.prop.prop分享与定义x.propy.prop。为了避免误差,定义v.prop.prop直。