作者cole945 (躂躂..)
看板C_and_CPP
標題Re: [問題] multiple local variable declaration
時間Sat Apr 30 13:15:56 2011
※ 引述《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)
推 VictorTom:推:) 04/30 14:18
→ tomap41017:推 04/30 15:04
→ loveme00835:不知道原原po吸不吸收得了 0.0 04/30 15:07
→ purincess:那如果有goto 而且直接吐branch/jump opcode的話 stack 04/30 17:35
→ purincess:就大亂了@@ 04/30 17:35
→ cole945:所以 1.原則通只在prologue/epilogue調stack 2.如果要在 04/30 17:55
推 scan33scan33:酷 04/30 17:55
→ cole945:中間調stack, 那通常是用fp/bp當base,不會拿sp當base 04/30 17:56
→ cole945:像使用alloca或variable length array的話,sp有可能在 04/30 17:57
→ cole945:brench內調sp,那對後面的code而言,直接用sp存取會有困難 04/30 17:58
推 singlovesong:謝謝:) 04/30 21:12