作者cjcat2266 (CJ Cat)
看板Flash
标题[讨论] 变数宣告的记忆体配置情形
时间Fri Oct 5 01:14:53 2007
嗯...忽然想要来po这篇文
因为之前开研讨会的时候,我发现大家好像这个部份问题颇多
希望可以藉此帮助观念不清楚的人澄清一下~ :)
-------------------以下为前言,不想看可以直接跳过-------------------
Flash跟Java一样
在传递变数的时候不像C++有分所谓的 pass-by-reference 和 pass-by-value
这两者个差异就在於用 等号(=) 来把右方的值丢给左方的时候
前者是把右方"记忆体上的所在位址"给左方,没有产生新的变数
像是C++里面的 int &y = x 就等於是说 "y is a nick name of x"
两者在记忆体上的资料代表的是同一块,只是名字不一样而已
至於後者就是把等号右边的值复制之後,丢给左边的变数
所以 int y = x 代表在记忆体上面x和y分别占了两块区域
并且资料内容互不相干
Flash和Java都是 纯pass-by-value
只要弄懂AS在背後到底在玩什麽把戏,就不用像C++为reference而烦恼
------------------------------本文开始-------------------------------
AS的变数可以如下分为两类:
1.Primitive datatype - Boolean, Number, String
这三者都是在记忆体上面直接纪录下自己的"值"
像是 var i:Number = 1; 就会在一区记忆体存入 1 这个值
var s:String = "abc"; 则在一区连续存入 "a", "b", "c"
2.Class datatype - 除了上述三种class以外的其他所有class
这些变数都会在记忆体上用到"两区"
一区就是该class的物件
另外一区则是该物件在记忆体的所在"位址"
简单来说,var i:Object = new Object();
new 这个关键字就代表在记忆体上生出一个Object物件
然後会回传该 Object 物件在记忆体上的位址给等号(=)的左边
等於i这个变数身上所装的值仅是一个 Object 物件的"地址"
※要注意的是,变数 i 并不是物件
它所代表的值才是该物件在记忆体上的所在位置
既然AS是纯 pass-by-value
如果又有一行 var j:Object = i;
这样只是把 i 身上的 "地址" 也给了 j
所以 "i 和 j 其实是代表同一个物件的"
来讲个单的范例吧:
var x:Number = 1;
var y:Number = x;
x++, y++;
trace(x + ", " + y); //得到的结果是 "2, 2"
var u:Object = new Object();
var v:Object = u;
u.num = 1;
v.num = 1;
u.num++, v.num++;
trace(u.num + ", " +v.num); //得到的结果是 "3, 3"
为什麽後者的 u.num 和 v.num 都是3?
不是明明都只各自递增了一次吗?
因为u和v身上所装的 Object 物件地址其实是同一个 Object 物件的
所以修改到的 num 这个property其实是属於同一个 Object 物件
大致上就是这样...
希望可以帮 对这部分不清楚的人 有所澄清
--
CJ Cat = Croa'J Cat = Cockroach Cat = 西街凯特 = 蜚蠊猫 = 蟑螂猫
Gallery
http://cjcat2266.deviantart.com
ptt2 Board CJWorkshop - 阿多比闪光(Adobe Flash)研讨区
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.228.89.126
※ 编辑: cjcat2266 来自: 61.228.89.126 (10/05 01:17)
1F:推 liveinlow:推荐这篇文章 :) 10/05 19:31
2F:推 kazenol:有研讨会真好 10/07 18:46