看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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