Re: [問題] multiple local variable declaration

看板C_and_CPP (C/C++)作者 (躂躂..)時間15年前 (2011/04/30 13:15), 編輯推噓3(308)
留言11則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《singlovesong (~"~)》之銘言: : 那temp 這個變數會被生100次出來在不同的記憶體位置嗎? : 如果會的話compiler or OS 會幫忙先清掉原本的temp嗎? : (否則會浪費99個int 的記憶體大小) 不要把 local 變數配置當成很複雜的東西, 與其說是allocate, 不如說只是單純的reserve一段stack來用, 像是這樣的function, 比較單純的想法是.. void fun () { sp -= 4 alloc i int i; i 在 sp+0 if (...) { sp -= 4 alloc t1 int t1; t1 在 sp+0, i 在 sp+4 sp += 4 free t1 } for (i=0; i<N; i++) { sp -= 4 alloc t2 int t2; t2 在 sp+0, i 在 sp+4 sp += 4 free t2 } sp += 4 free i } 雖然有三變數, 其實只需要兩塊空間, 不斷調stack不只沒有效率, 也會讓變數的位置比較難算 像是上面的例子, 在不同的nestd scope, 有時i是sp[0]有時是sp[1] (在很多architecture上會用 frame pointer或base pointer來幫忙) 所以真正的做法其實是 void fun () { sp -= 8 int i; i 在 sp+4 if (...) { int t1; t1 在 sp+0, i 在 sp+4 } for (i=0; i<N; i++) { int t2; t2 在 sp+0, i 在 sp+4 } sp += 8 } 也就是說.. 根本沒什麼好free的, 一return什麼都還回去了. 且同一個level的scope還會shared到一樣的空間. 不過若是C++, 就還要考慮建構/解構的overhead了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.226.108 ※ 編輯: cole945 來自: 111.251.226.108 (04/30 13:18) ※ 編輯: cole945 來自: 111.251.226.108 (04/30 13:18)

04/30 14:18, , 1F
推:)
04/30 14:18, 1F

04/30 15:04, , 2F
04/30 15:04, 2F

04/30 15:07, , 3F
不知道原原po吸不吸收得了 0.0
04/30 15:07, 3F

04/30 17:35, , 4F
那如果有goto 而且直接吐branch/jump opcode的話 stack
04/30 17:35, 4F

04/30 17:35, , 5F
就大亂了@@
04/30 17:35, 5F

04/30 17:55, , 6F
所以 1.原則通只在prologue/epilogue調stack 2.如果要在
04/30 17:55, 6F

04/30 17:55, , 7F
04/30 17:55, 7F

04/30 17:56, , 8F
中間調stack, 那通常是用fp/bp當base,不會拿sp當base
04/30 17:56, 8F

04/30 17:57, , 9F
像使用alloca或variable length array的話,sp有可能在
04/30 17:57, 9F

04/30 17:58, , 10F
brench內調sp,那對後面的code而言,直接用sp存取會有困難
04/30 17:58, 10F

04/30 21:12, , 11F
謝謝:)
04/30 21:12, 11F
文章代碼(AID): #1DkviFTH (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DkviFTH (C_and_CPP)