作者VictorTom (鬼翼&娃娃魚)
看板C_and_CPP
標題Re: [問題] local變數 行為
時間Wed Dec 16 00:54:27 2009
※ 引述《QQ29 (我愛阿蓉)》之銘言:
: 標題: [問題] local變數 行為
: 時間: Wed Dec 16 00:22:11 2009
:
小弟我回應一下我理解的原po想測試的東西與問題....
因為再推文下去好像有點麻煩難解釋XD
: 今天突然想到一個小問題
: class A
: {
: public:
: void XD(){int x;<==故意不給初值 cout<<x; x++;}
: };
:
: A a1,a2;
: a1.XD(); a2.XD();
:
: 我認為我預期答案也許會差1
: 不過手邊沒vc 請同學用vc6 測試 印出兩次-xxxxx 一樣的兩個任意數值
: 我印象vc8好像去存取沒初始質的變數會發出exeption
應該是發warning, 而且是compile time就會告訴你....
exception這種應該是run time才會遇到的....
: 這我忽略~ 我是好奇 a1.XD()到a2.XD()這之間
: x到底是動了甚麼手腳 為啥會在初始化一次
: 我觀念是local變數跳出這scope 就類似delete一樣標記這位址的值可以被蓋掉
: 但是現在看來 x好像都會初始成某一個奇怪的特定數值
: 請問該怎麼解釋呢???
一般function call內的local var只是在function進入時....
把傳入參數與內部使用的local var通通由stack來存放....
所以實際上不會像delete一樣用標記的方式....
因為stack的push/pop與內容值就一直隨run time在改變....
至於未初始化的變數小弟在原文推文裡有解釋過了....
VC debug build會把local var都初始化成0xcccccccc(視byte count不同)
動態配置來的空間則初始畫成0xcdcdcdcd....
這點可以下break point與watch來看看就知道了....
:
:
: thx~~
:
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc)
: ◆ From: 123.192.136.174
: 推 VictorTom:VC的debug mode會把區域變數初始化為0xcccccccc, 動態要 12/16 00:29
: → VictorTom:來的初始化成0xcdcdcdcd; 你可以下break用watch看:) 12/16 00:30
: → dp2:支持VT。。我好想不能推文了 12/16 00:34
: 推 oddguy:這個程序……請仔細看,對于a1是分配了一個未初始化的local 12/16 00:41
: 推 VictorTom:樓上要cd一下才能再推文XD 該技能要冷卻時間才能再用XDD 12/16 00:41
: → oddguy:變數x,對于a2則是另外又再分配了一個未初始化的變數x啊 12/16 00:42
: → nowar100:兩個是不同的物件阿 XD 12/16 00:43
: → oddguy:兩者絕不是同一個x!所以當然不會是差1了 12/16 00:43
: → VictorTom:存取未初始化的變數應該是發warning, 不是exception@_@" 12/16 00:43
: → QQ29:兩個是同一個x吧~ 我印他們位址是一樣的阿 12/16 00:43
: → oddguy:實際上a1.XD()執行完畢后,local變數x已經不存在了。 12/16 00:44
其實導入object小弟不太確定, 但是如果是普通function call的話....
像原po舉例的單純function連call兩次, 是很容易同一變數配在同一位址....
因為同樣的function它push進stack各變數佔用的layout理論上是一樣的....
local x與其說不存在, 不如說那塊記憶體現在不歸它使用了....
個人猜原po是不是想模擬function基於stack特性使用了同一位址....
於是用很tricky的方式(也不是很有效)來測試記憶體中的暫留值....
測試結果之所以失敗, 就是小弟說的VC的機制....
改release built會不會成功, 小弟我也不知道XD
以上, 就個人解讀與猜測騙一下文章數....
有漏誤的還請各位大大不吝指正....<(_ _)>
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.132.174.98
→ dp2:可以看下匯編碼,但是手頭沒有vc6,不知vc8/9行為是否一致 12/16 00:55
推 oddguy:解釋的非常清楚!拍手 12/16 00:57
→ oddguy:function stack的問題,印象中是語言特性,與vc編譯器無關 12/16 00:58
推 dp2:順便推一把…… 12/16 00:58
→ oddguy:對了小弟新來ptt,不知“cd一下再推文”的“cd”是何意? 12/16 01:03
→ nowar100:cool down 12/16 01:04
→ dp2:看了2008的匯編代碼,確實是先寫入0xcccccccccccccccccccccccc 12/16 01:07
推 jaw109:cccccccc,cdcdcdcd,feeefeee這都是有意義的 12/16 01:10
→ jaw109:詳見wiki "magic number" 12/16 01:10
→ VictorTom:對不起我不該耍冷講cd, 前陣子才學會這詞想說秀一下Orz 12/16 01:13
→ VictorTom:說到magic number, 我們家driver最愛用deadbeef....XD 12/16 01:17
推 nowar100:長知識了@@" 原來這是magic number 12/16 01:23