Re: [問題] local變數 行為

看板C_and_CPP作者 (拋磚引玉)時間15年前 (2009/12/15 17:39), 編輯推噓6(6020)
留言26則, 8人參與, 最新討論串3/3 (看更多)
※ 引述《QQ29 (我愛阿蓉)》之銘言:

12/16 01:27,
可是我測試版大的程序 位址也還是一樣阿...
12/16 01:27

12/16 01:27,
stack 難道不能定死說一定只在那個位址作存取嗎?
12/16 01:27

12/16 01:28,
如果位址會不一樣 那為啥要討論 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)

12/16 01:44, , 1F
push.... 不用pop了XD
12/16 01:44, 1F

12/16 01:44, , 2F
return; 這樣不pop都不行 XD
12/16 01:44, 2F

12/16 01:45, , 3F
說起static和多線程,前幾天剛剛發現gcc的__thread擴展,使用
12/16 01:45, 3F

12/16 01:46, , 4F
TLS,和static配合起來可以繞過很多問題……
12/16 01:46, 4F

12/16 01:49, , 5F
那global變數配置在data segment算是在heap嚕??只會有一份
12/16 01:49, 5F

12/16 01:49, , 6F
所以也需要做critical section的控管??
12/16 01:49, 6F

12/16 01:51, , 7F
我一直搞不清楚global是在哪 還是是您說的static區
12/16 01:51, 7F

12/16 01:51, , 8F
global會配在data 和 heap 是分開的,都只會有一份
12/16 01:51, 8F

12/16 01:51, , 9F
我說的 static 區就是指 data ,一時想不起來專有名詞 QQ
12/16 01:51, 9F

12/16 01:51, , 10F
global視情況而定在data段或rodata或bss……變化很多……
12/16 01:51, 10F

12/16 01:53, , 11F
啊,我說的不是運行期概念..data,好吧..是data..
12/16 01:53, 11F

12/16 01:53, , 12F
受教了,我聽老師說還以為只會在 data XD
12/16 01:53, 12F

12/16 01:53, , 13F
是我弄混了 XD
12/16 01:53, 13F

12/16 01:53, , 14F
啥 XD? 囧
12/16 01:53, 14F

12/16 01:58, , 15F
12/16 01:58, 15F

12/16 01:59, , 16F
呃,沒啥,我半夜不太清醒,忘了bss段load之後會怎樣……
12/16 01:59, 16F

12/16 02:00, , 17F
好吧, 既然都半夜了, 就 sleep(21600); 吧....XDDDZZzzz
12/16 02:00, 17F

12/16 03:09, , 18F
bss 不會佔用實體檔案大小,執行期才會配置出來並填入 0,
12/16 03:09, 18F

12/16 03:09, , 19F
用來裝 global 區段沒有設定初值的變數,有設定初值的那種
12/16 03:09, 19F

12/16 03:10, , 20F
會放在一般 data,裡面是預先填入的數字,執行的時候直接
12/16 03:10, 20F

12/16 03:10, , 21F
讀進 memory,所以會是 program 檔案大小的一部份。
12/16 03:10, 21F

12/16 03:11, , 22F
但是這些都不重要,反正只要不是在 stack 上就都是共用的
12/16 03:11, 22F

12/16 03:11, , 23F
,當然 TLS 除外。
12/16 03:11, 23F

12/16 10:34, , 24F
連 TLS 都出來了 ...
12/16 10:34, 24F

12/16 10:41, , 25F
t大是研究compiler的人阿...XD
12/16 10:41, 25F

12/16 14:42, , 26F
t 大三點還在推文... 真是拼 @@
12/16 14:42, 26F
文章代碼(AID): #1B9yczI9 (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
問題
10
46
完整討論串 (本文為第 3 之 3 篇):
問題
10
46
文章代碼(AID): #1B9yczI9 (C_and_CPP)