代码生成静态确定处理对象的寿命。当您使用手柄对象,这种静态分析有一定的限制。
静态分析所生成的代码可以复用存储器而不是依赖于动态存储器管理方案,诸如引用计数或垃圾收集。代码生成器可避免动态存储器分配和运行时自动存储器管理。这些生成的代码特性对于某些安全关键和实时应用很重要。
对于限制,请参见:
代码生成器分析所有变量是否在使用前定义。未定义的变量或数据类型的代码生成期间导致错误。在某些情况下,代码生成器无法确定是否被定义来处理对象的引用。看到引用处理的对象可以显示未定义。
考虑手柄类mycls
和功能usehandle1
。代码生成报告错误,因为p
,这是外循环,具有指一个属性mycls
对象在循环内创建的。
classdefmycls <手柄性能支柱结束结束
功能usehandle1 P = mycls;对于I = 1:10 p.prop = mycls;结束
如果一个持久变量是指处理对象,代码生成器,方便程序的生命周期中只有一个实例对象。该对象必须是一个独生子目的。要创建一个单独处理对象,即在创建对象的封装声明如果的isEmpty()
后卫持久变量。
例如,考虑类mycls
和功能usehandle2
。代码生成报告的错误usehandle2
因为p.prop
指mycls
反对的声明内= mycls
创建。此语句创建mycls
对象的每个调用usehandle2
。
classdefmycls <手柄性能支柱结束结束
功能usehandle2(x)的断言(ISA(X,'双'));一贯磷;内= mycls;inner.prop = X;如果的isEmpty(P)P = mycls;p.prop =内;结束
如果移动报表内= mycls
和inner.prop = X
在 - 的里面如果的isEmpty()
后卫,代码生成成功。该声明内= mycls
该程序的生命周期内执行一次。
功能usehandle2(x)的断言(ISA(X,'双'));一贯磷;如果的isEmpty(P)内= mycls;inner.prop = X;P = mycls;p.prop =内;结束
考虑函数usehandle3
。代码生成报告的错误usehandle3
由于持续的变量p
指mycls
反对的声明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.prop
和y.prop
共享相同的值。代码生成器无法确定该手柄对象属性v.prop.prop
分享与定义x.prop
和y.prop
。为了避免误差,定义v.prop.prop
直。