[問題] 用全域變數不好嗎?

看板C_and_CPP作者 (woodpeaker)時間15年前 (2009/05/26 17:53), 編輯推噓16(16029)
留言45則, 18人參與, 最新討論串1/1
不知道為什麼我C++的老師規定 我們寫程式不能用全域變數 難道用全域變數比較差嗎? 麻煩各位版友回答一下吧 感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.136.175.106

05/26 17:57, , 1F
全域變數有它合用的地方, 但初學者肯定會誤用. 你就當
05/26 17:57, 1F

05/26 17:57, , 2F
global var is evil 吧, 對初學者而言比較好
05/26 17:57, 2F

05/26 18:26, , 3F
存活時間太久,記憶體空間跟變數名稱都一直佔著
05/26 18:26, 3F

05/26 18:50, , 4F
我覺得它跟goto是同等級的利器 XDDD
05/26 18:50, 4F

05/26 18:54, , 5F
Linux kernel 裡有很多全域變數 也有很多 goto XD
05/26 18:54, 5F

05/26 18:54, , 6F
寫code不是玩機戰啊~~地圖兵器不要亂放....XD
05/26 18:54, 6F

05/26 19:24, , 7F
濫用全域變數會讓程式快速接近崩潰邊緣.......
05/26 19:24, 7F

05/26 19:38, , 8F
還好吧, 蠻好用的啊
05/26 19:38, 8F

05/26 19:42, , 9F
debug不易 很容易不知道是誰改了他 因為隨便就能改
05/26 19:42, 9F

05/26 19:46, , 10F
大型程式用太多global variable可能會造成memory不足
05/26 19:46, 10F

05/26 19:47, , 11F
而且練習memory的控管很重要
05/26 19:47, 11F

05/26 19:49, , 12F
會讓function之間相依性太高 如果要修改 會改到死
05/26 19:49, 12F

05/26 19:50, , 13F
怕手殘改到而已 小程式當然無所謂
05/26 19:50, 13F

05/26 20:11, , 14F
可以請大家舉例說什麼情況 就不該使用global嗎?
05/26 20:11, 14F

05/26 20:11, , 15F
像有些就覺得不寫成global好像就不會寫了.....
05/26 20:11, 15F

05/26 20:18, , 16F
樓上說說看非用global variable的情況吧
05/26 20:18, 16F

05/26 22:03, , 17F
signal handler 的 flag
05/26 22:03, 17F

05/26 22:29, , 18F
跨檔案的變數 global吧 cin/cout... 物件算嗎?
05/26 22:29, 18F

05/26 22:30, , 19F
全域變數和goto 都很好用!
05/26 22:30, 19F

05/26 23:31, , 20F
global var 最大的危險就是會存取到上一次迭代留下的遺跡
05/26 23:31, 20F

05/26 23:32, , 21F
,所以必須要特別花時間留意適時的 reset 它們的值。
05/26 23:32, 21F

05/26 23:34, , 22F
另外它可能會引發效能問題,某些平台全域變數存取很慢。
05/26 23:34, 22F

05/27 00:15, , 23F
global var 的最大危險 是我覺得不得不的解法
05/27 00:15, 23F

05/27 01:14, , 24F
scope 太大 ... 難 debug
05/27 01:14, 24F

05/27 01:27, , 25F
global 最容易知道被誰改吧 ...
05/27 01:27, 25F

05/27 01:28, , 26F
而且 global 又不一定不好 只要知道 4k memory block
05/27 01:28, 26F

05/27 01:28, , 27F
反而可以有效節省空間
05/27 01:28, 27F

05/27 02:51, , 28F
"global 最容易知道被誰改吧" 除非整個程式碼你都看的到
05/27 02:51, 28F

05/27 02:57, , 29F
local variable如果運算錯誤 可以很明顯知道是該
05/27 02:57, 29F

05/27 02:57, , 30F
function內部的問題 但如果是global variable
05/27 02:57, 30F

05/27 02:58, , 31F
尤其是那種非常多function都會去access的
05/27 02:58, 31F

05/27 02:59, , 32F
當你一個program花1s run完 可能就被改了數百次以上
05/27 02:59, 32F

05/27 02:59, , 33F
遇到這種情形就很難找出到底從哪裡開始錯的
05/27 02:59, 33F

05/27 03:01, , 34F
如果是遇到更棘手的情形: 該variable中間有幾次的
05/27 03:01, 34F

05/27 03:01, , 35F
算出錯 但是後來又因為一些特例變成對的
05/27 03:01, 35F

05/27 03:02, , 36F
結果造成debug 沒de出來 很可能會在demo的時候就
05/27 03:02, 36F

05/27 03:02, , 37F
出紕漏
05/27 03:02, 37F

05/27 09:55, , 38F
global 最不容易知道是誰改 xD
05/27 09:55, 38F

05/27 10:11, , 39F
為了效能勉強可接受..但是養成習慣就慘了
05/27 10:11, 39F

05/27 11:27, , 40F
global variable 的存取效能在某些平台上很差喔。
05/27 11:27, 40F

05/27 11:29, , 41F
load/store 架構,有 GOT 的通常會有兩次 memory access。
05/27 11:29, 41F

05/27 23:22, , 42F
恩... 有玩過可以下 memory breakpoints 應該知道吧
05/27 23:22, 42F

05/28 09:51, , 43F
struct的member被其他pointer指來指去
05/28 09:51, 43F

05/28 09:52, , 44F
這樣會比global更清楚被誰改的麼?
05/28 09:52, 44F

05/28 09:52, , 45F
乾脆不要用pointer好了 pointer是很危險的東西
05/28 09:52, 45F
文章代碼(AID): #1A6xm9wa (C_and_CPP)