[問題] C的local variable初始化為什麼要無定義?

看板C_and_CPP作者 (機機勳)時間8年前 (2017/04/30 21:32), 編輯推噓6(6013)
留言19則, 9人參與, 最新討論串1/1
請問一下,在C語言中 局部變量若沒顯式定義的話,他不會像全域變量一樣預設0 這樣設計的理由是什麼呢? 以前我都不會理這個問題,只是最近在學計組和compiler 突然覺得需要搞懂~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.230.38.163 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1493559140.A.C23.html

04/30 22:52, , 1F
藉機問一下,.bss的變數有保證會初始為0嗎?
04/30 22:52, 1F

04/30 23:08, , 2F
https://goo.gl/oRNoHi 6.7.8 看來是 c 標準的規定
04/30 23:08, 2F

05/01 03:15, , 3F
Linux下.bss段就是給這個segment一個zeroed pages所以
05/01 03:15, 3F

05/01 03:16, , 4F
一定會是0八
05/01 03:16, 4F

05/01 03:58, , 5F
變量…
05/01 03:58, 5F

05/01 09:12, , 6F
只宣告那編譯器只要劃空間過去就好, 不用多一道指令搬資料
05/01 09:12, 6F

05/01 09:22, , 7F
因為C有可能會使用Stack存放變數,所以會讀到之前的資料
05/01 09:22, 7F

05/01 09:23, , 8F
如果不這樣,那就表示每次都要隱式清理,估計是效能考量
05/01 09:23, 8F

05/01 10:56, , 9F
stack的處理方式比bss麻煩多了,每個function都要清
05/01 10:56, 9F

05/01 15:13, , 10F
因為效率
05/01 15:13, 10F

05/01 15:19, , 11F
從84頁開始看,或從頭看完. https://goo.gl/GMJ1DS
05/01 15:19, 11F

05/04 08:15, , 12F
有個更有趣的事實,大多數編譯器debug下會做相反的事情
05/04 08:15, 12F

05/04 08:15, , 13F
寫入一個特定數以方便debug
05/04 08:15, 13F

05/04 08:16, , 14F
不過這個特定數一定不是0就是 XD
05/04 08:16, 14F

05/05 21:40, , 15F
少數 MCU 廠會要求不要把 bss 清 0 XD
05/05 21:40, 15F

05/05 21:53, , 16F
什麼,不把bss清0有什麼好處嗎?
05/05 21:53, 16F

05/06 10:11, , 17F
之前寫kernel lib有use case,該app是拿來dump的
05/06 10:11, 17F

05/06 10:11, , 18F
而dump可以直接把記憶體宣告到特定位置上 不清空就可以
05/06 10:11, 18F

05/06 10:12, , 19F
免去一次copy的時間,不知道上面提的MCU是不是類似case
05/06 10:12, 19F
文章代碼(AID): #1P1UTamZ (C_and_CPP)