→ QQ29:可是我測試版大的程序 位址也還是一樣阿... 12/16 01:27
→ QQ29:stack 難道不能定死說一定只在那個位址作存取嗎? 12/16 01:27
→ QQ29:如果位址會不一樣 那為啥要討論 critical section呢@@ 12/16 01:28
class A
{
public:
void XD(){int x; cout << &x << endl; x++;}
};
void test(A a2){
a2.XD();
}
int main(){
A a1,a2;
a1.XD();
// a2.XD();
test(a2);
}
> g++ test.cpp // 未經最佳化
0x7fff6825a58c
0x7fff6825a57c
> g++ -O3 test.cpp
0x7fffcb5ac76c
0x7fffcb5ac76c
以下稍做解釋:
原程式 a1.XD() return 回來之後,stack 又回到原來的位置
這時候您再直接去 call a2.XD(),stack 當然又會增長到同一塊位置
至於您說的function配置好空間
那是code的部分,與您的觀念並無衝突
每個 Process 在跑的時候粗略來分都有 stack heap code static 幾塊空間
code 的部分,裡面的內容是編譯時就會寫好有哪幾條 bytecode,這就是您所說的
但是實際上在 run program 的時候
他的自動變數是長在 stack 上,這塊是動態消長的,是 OS 當下分給您的
兩個是不一樣的事情
critical section 又是另一回事
這是在 multithread 的時候
這時您的 Process 一樣會分成好幾塊空間
但是此時 stack 隨著幾個 thread 就會有幾個,而 heap static 只會有一份
所以我們要避免不同的 thread 去存取同一份 heap 或 static 空間
這跟剛剛那些又是完全不一樣的議題了 @@"
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.235.154
※ 編輯: nowar100 來自: 140.113.235.154 (12/16 01:43)
推 VictorTom:push.... 不用pop了XD 12/16 01:44
→ nowar100:return; 這樣不pop都不行 XD 12/16 01:44
→ dp2:說起static和多線程,前幾天剛剛發現gcc的__thread擴展,使用 12/16 01:45
→ dp2:TLS,和static配合起來可以繞過很多問題…… 12/16 01:46
推 QQ29:那global變數配置在data segment算是在heap嚕??只會有一份 12/16 01:49
→ QQ29:所以也需要做critical section的控管?? 12/16 01:49
→ QQ29:我一直搞不清楚global是在哪 還是是您說的static區 12/16 01:51
→ nowar100:global會配在data 和 heap 是分開的,都只會有一份 12/16 01:51
→ nowar100:我說的 static 區就是指 data ,一時想不起來專有名詞 QQ 12/16 01:51
→ dp2:global視情況而定在data段或rodata或bss……變化很多…… 12/16 01:51
→ dp2:啊,我說的不是運行期概念..data,好吧..是data.. 12/16 01:53
→ nowar100:受教了,我聽老師說還以為只會在 data XD 12/16 01:53
→ dp2:是我弄混了 XD 12/16 01:53
→ nowar100:啥 XD? 囧 12/16 01:53
→ dp2:呃,沒啥,我半夜不太清醒,忘了bss段load之後會怎樣…… 12/16 01:59
推 VictorTom:好吧, 既然都半夜了, 就 sleep(21600); 吧....XDDDZZzzz 12/16 02:00
→ tinlans:bss 不會佔用實體檔案大小,執行期才會配置出來並填入 0, 12/16 03:09
→ tinlans:用來裝 global 區段沒有設定初值的變數,有設定初值的那種 12/16 03:09
→ tinlans:會放在一般 data,裡面是預先填入的數字,執行的時候直接 12/16 03:10
→ tinlans:讀進 memory,所以會是 program 檔案大小的一部份。 12/16 03:10
→ tinlans:但是這些都不重要,反正只要不是在 stack 上就都是共用的 12/16 03:11
→ tinlans:,當然 TLS 除外。 12/16 03:11
推 avhacker:連 TLS 都出來了 ... 12/16 10:34
→ akasan:t大是研究compiler的人阿...XD 12/16 10:41
推 ledia:t 大三點還在推文... 真是拼 @@ 12/16 14:42