flash中try catch的不同编译

本文详细探讨了在ActionScript中使用try-catch块时,临时变量如何影响作用域与内存分配,通过对比不同代码片段的编译后结果,揭示了变量名保留与内存分配机制的奥秘。同时,文章还解答了一个关于Error抛出后变量未初始化仍能输出值的疑惑,解释了这一现象背后的原理。

转自http://www.laaan.cn/?p=905

先看两端代码:

function  aaa(): void
{
    
var  bytes:ByteArray;
    
try
    { } 
    
catch  (e:Error)
    { }
}

 

 

以及:

function  aaa(): void
{
  
var  bytes:ByteArray;
}

 

 

然后看编译后,用硕思反编译看到的代码对应是:

function  aaa() :  void  
{
   
var  bytes:ByteArray;
   
try {}
   
catch  (e:Error)
   {}
   
return ;
}
//  end function

 

 

以及:

function  aaa() :  void
{
    
var  _loc_1:ByteArray;
    
return ;
}
//  end function

 

看看加粗的部分代码,第一种情况下竟然临时变量的变量名被保存了。而实际上,临时变量在编译时,由于不会被域外(比如该方法域)引用,就不会将变量名编译到swf文件中,而是在运行时分配空间,直接使用,使用后释放空间。为什么什么出现这样的情况呢?

我解析了他们的指令集:
function aaa():void    /* disp_id 0*/
{
activation {
var test_fla::bytes:flash.utils::ByteArray    /* slot_id 1 */
}

// local_count=3 max_scope=5 max_stack=3 code_len=34
0       getlocal0
1       pushscope
2       newactivation
3       dup
4       setlocal1
5       pushscope
6       getscopeobject    1
8       pushnull
9       coerce            flash.utils::ByteArray
11      setslot           1

13      jump              L1

17      getlocal0
18      pushscope
19      getlocal1
20      pushscope
21      newcatch          0
23      dup
24      setlocal2
25      dup
26      pushscope
27      swap
28      setslot           1
30      popscope
31      kill              2

L1:
33      returnvoid
}

以及:

function aaa():void    /* disp_id 0*/
{
// local_count=2 max_scope=1 max_stack=1 code_len=7
0       getlocal0
1       pushscope
2       pushnull
3       coerce            flash.utils::ByteArray
5       setlocal1

6       returnvoid
}

主要的不同在于:在第一种方式下,会使用activation来保存变量,activation存在变量名;第二种情况是使用local空间存贮变量,及现开辟空间,没有变量名。而导致使用activation来保存变量的主要原因是try catch模块的使用。

说去try catch我又想起另外一个想不通的地方:

ExpandedBlockStart.gif 代码
public  function  aaa(): void  
{
    
var  bytes:ByteArray;

    
try  
    {
        bytes 
=   new  ByteArray();
        bytes.writeUTFBytes(”abc”);

        
throw   new  Error(”asdf”);
    }
    
catch  (e:Error) 
    { }
    trace(bytes);
}

 

调用方法aaa,竟然会输出abc出来。按我的理解,遭遇Error后,应该回滚啊,这样的话bytes还是没有初始化并赋值。后来到群里面一讨论,竟然都说是正常的~~ 汗,大学基础课上得也太失败了~~~

转载于:https://www.cnblogs.com/qiance/archive/2010/08/22/1805719.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值