[分享] C/C++語言工作上的心得

看板C_and_CPP作者 (淺水中)時間12年前 (2012/04/28 22:55), 編輯推噓24(24051)
留言75則, 24人參與, 最新討論串1/2 (看更多)
各位板友大家好 小弟工作經驗約3年多 寫程式從高中到工作約有10幾年的經驗 工作上主要使用的語言是C或是C++ 小弟待過系統廠和IC Design廠 今天來分享我在業界看到的一些現在和我個人的想法 也許不一定正確 但也許可以給學子門一些軟工上的啟發 先說我在系統廠上的經驗 我之前是在網通廠 使用的Broadcom的solution Broadcom的程式碼主要是用C++為主 它的程式有幾個特色 1. 非常少使用指標, 除了DMA之外可以說沒有用到指標 2. 自己實作Buffer class來配置記憶體, 解構子處理的很好 只要使用Buffer class就可以輕鬆配置memory,不會memory leak (前題是你不要傻傻的去new buffer class) 3. 大量使用singleton 4. 在C++裡面不會出現global variable, 所有的東西一律抽象化(class化) 5. 程式寫作一致,很容易閱讀 換了工作後到了台廠IC design 我看完了code我發現台灣的軟工跟Broadcom一比起來還有一段差距 我舉幾個我看到的現像 1. makefile格式不統一,到處都有放,要花很多時間來搞清楚先後順序 2. shared library沒有好好管理,我個人的看法是shared library要儘量做到local化 減少參考其他shared library的,但我居然發現有出現shared libray互相reference 對方的詭異現象,這很明顯是link library的時候沒有clean build,然後binary release. 3. 亂用pointer,也許定API或interface的人很強,但實作的人卻普普或是根本不懂這個 指標要幹麻, 我舉個例子好了 //@param out_b : pass a pointer and return an allocate space to pointer // out_b void myFunc(void *in_b, uint32 in_len, void *out_b, uint32 *out_len) 我看了這段code之後我直覺就想到這個會動嗎?這只會memory leak吧 為什麼要pass一個pointer到function裡面malloc,還是pass一個void * 而不是pass void **? 為什麼要幫人製造大便?大便不是自己做自己清嗎? 4. void *很好很強大, 但不要走火入魔. 我舉個例子 void setDataStruct(void *struct) { XXX_type *myType= (XXX_type*) struct; } 看起來沒啥問題,問題是用setDataSturct的人居然可以不知道XXX_type的結構 設計者所說他不希望到處放.h檔,所以這樣用?我聽了內心只有一聲"X" 5. 非必要不要自己造輪子 一個最多只有32個element的struct為什麼要寫linkedlist 宣告MAX_LENGTH 64就很夠用了吧, 比較省記憶體? stack都用不完了為什麼要用heap? 還有memory leak的風險咧 6. goto很好很強大, 拿來error handler非常好, 但每的function都這樣用 讓我感受到大量使用goto只顯示你寫code malloc了太多大便, 導致 一定要goto來清大便, 不懂為什麼要到處拉屎, 能用array就array為什麼 要用pointer來顯示自己的高級? 7. 給我為什麼一定要用C語言的理由, 除非是3rd的code是C++,不然很多人都排斥 C++, 這一點我不懂, C++有更好的container, STL, destructor, safe pointer, oop, 更嚴格的type check, 不使用它的理由是? 8. 程式一堆warning, compiler都看不下去了還給人看.... 其實還有一堆 但目前想不起來 希望大家寫的code不要變成這樣 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.135.55 ※ 編輯: calais007 來自: 114.37.135.55 (04/28 22:56)

04/28 23:02, , 1F
我覺得第四點比較不奇怪,有時使用者不用管struct內容
04/28 23:02, 1F

04/28 23:02, , 2F
只要有指標跟正確的setter/getter就可以操作了
04/28 23:02, 2F

04/28 23:05, , 3F
另外有些環境要用C++會挺麻煩的,譬如EDK2這種東西
04/28 23:05, 3F

04/28 23:08, , 4F
一邊是有紀律有組織,一邊是得過且過,惡性循環
04/28 23:08, 4F

04/28 23:09, , 5F
warning 多很有可能原本是 VC6 時期寫,換新編譯器後...
04/28 23:09, 5F

04/28 23:10, , 6F
話說有的時間的話我也好想整頓手邊的程式碼,可是....
04/28 23:10, 6F

04/28 23:11, , 7F
還是早點下班才是真的,上星期平均十一點離開公司 orz
04/28 23:11, 7F

04/28 23:41, , 8F
XXX_type myType= *(XXX_type*) struct; ?
04/28 23:41, 8F

04/28 23:44, , 9F
其實singleton就是global variable
04/28 23:44, 9F

04/28 23:45, , 10F
早點下班才是真的xdd
04/28 23:45, 10F

04/28 23:45, , 11F
你整頓了沒產能反而是你被唸
04/28 23:45, 11F
※ 編輯: calais007 來自: 114.37.135.55 (04/28 23:53)

04/28 23:54, , 12F
第三點真的很妙
04/28 23:54, 12F

04/29 00:01, , 13F
寫kernel module的話不用C++很正常吧? 前同事不愛用STL則
04/29 00:01, 13F

04/29 00:02, , 14F
是因為他覺得performance不好, 所以見人見智囉
04/29 00:02, 14F

04/29 00:12, , 15F
3 也不見得會 leak 吧 ... 雖然那個 void* 會誤導人 XDD
04/29 00:12, 15F

04/29 00:19, , 16F
7 的話,我是覺得 C 比較簡單 ... 雖然寫 code 的人要負
04/29 00:19, 16F

04/29 00:20, , 17F
out_b 那個註解的英文我看不太懂,是他寫錯還是我有問題?
04/29 00:20, 17F

04/29 00:20, , 18F
更多的責任。
04/29 00:20, 18F

04/29 00:21, , 19F
回傳一個 allocate space,這 space 是要怎樣 return
04/29 00:21, 19F

04/29 00:21, , 20F
他要把 void* cast 成某個東西的** 吧 XD
04/29 00:21, 20F

04/29 00:21, , 21F
我知道他想幹嘛,但那英文總覺得很怪
04/29 00:21, 21F

04/29 00:22, , 22F
allocated ?
04/29 00:22, 22F

04/29 00:24, , 23F
傳一個null pointer進去,出來是有memory space的
04/29 00:24, 23F

04/29 00:28, , 24F
04/29 00:28, 24F

04/29 00:30, , 25F
傳 NULL 進去沒 segfault 的話就是程式有問題 XD
04/29 00:30, 25F

04/29 01:11, , 26F
第三個不會很奇怪,你把c寫的很oo的話,當你new一個obj的
04/29 01:11, 26F

04/29 01:12, , 27F
時候就會在newObj裡malloc。當然要有對應的function來
04/29 01:12, 27F

04/29 01:12, , 28F
做類似delete的動作,把newObj malloc的收乾淨
04/29 01:12, 28F

04/29 01:14, , 29F
拍謝我看錯了囧
04/29 01:14, 29F

04/29 02:19, , 30F
Embedded sytem中開發Kernel module的話,memory需要計較
04/29 02:19, 30F

04/29 02:21, , 31F
記憶體能省就省,我個人偏見覺得是個好習慣啦
04/29 02:21, 31F

04/29 02:36, , 32F
同意,台灣的品質快輸對岸了
04/29 02:36, 32F

04/29 08:00, , 33F
不用 STL 是因為 template instances 一多的話會吃記憶體
04/29 08:00, 33F

04/29 08:01, , 34F
。不過這也只有偉大的鬼島做出來的硬體需要擔心這...
04/29 08:01, 34F

04/29 08:24, , 35F
推B大,我也覺得C比較簡單,有些功能簡單架構單純的,用C比較好
04/29 08:24, 35F

04/29 08:25, , 36F
呃,記憶體是要錢的。這種成本考量不是只有台灣的 design
04/29 08:25, 36F

04/29 08:26, , 37F
house 才會這樣,國內外都一樣。比較的可怕的是對硬體資
04/29 08:26, 37F

04/29 08:26, , 38F
源的使用毫無節制的 programmer >_<
04/29 08:26, 38F

04/29 08:42, , 39F
^那
04/29 08:42, 39F
同意在某些情形記憶體要斤斤計較 像寫ASIC的firmware或是kernel module 但這些東西我是在AP層看到的 process的stack本身就很夠用了 擺在那邊不用改用heap反而跟其他process搶memory 這樣有比較省?也許我的觀念錯誤吧. ※ 編輯: calais007 來自: 114.37.135.55 (04/29 09:52)

04/29 13:20, , 40F
我覺得有的公司不用C++的原因,是因為怕找不到會C++的人
04/29 13:20, 40F

04/29 13:20, , 41F
要找C跟C++的人才,前者真的簡單很多...
04/29 13:20, 41F

04/29 17:30, , 42F
我是針對推文而推文的,而不是原 PO 的文章哦。XD
04/29 17:30, 42F

04/30 09:57, , 43F
推! 蠻想知道goto用法長怎樣的,目前只在fsm裡看過..
04/30 09:57, 43F

04/30 10:41, , 44F
若有個 TranslateToTxt(char *srcStr, char *outFile)
04/30 10:41, 44F

04/30 10:41, , 45F
翻譯後的字串放在 malloc(xx) 建的記憶體裡,然後要輸出到
04/30 10:41, 45F

04/30 10:42, , 46F
檔案時失敗,可能用 goto 跳到函數結尾,用 free 清記憶體
04/30 10:42, 46F

04/30 10:43, , 47F
感謝p大補充.
04/30 10:43, 47F

04/30 10:45, , 48F
Linux 核心程式碼就有少許 goto
04/30 10:45, 48F

04/30 11:45, , 49F
goto在過往被妖魔化得很嚴重。妥善利用的話是個好物。
04/30 11:45, 49F

04/30 11:58, , 50F
Linux kernel的goto其實也不算少許了
04/30 11:58, 50F

04/30 15:13, , 51F
goto..在c++的地位會滿輕的.因為c++這邊有例外處理的
04/30 15:13, 51F

04/30 15:14, , 52F
議題.
04/30 15:14, 52F

04/30 15:16, , 53F
置於第三點,以前就有提醒我多參考strcpy得作法.一個lib
04/30 15:16, 53F

04/30 15:17, , 54F
函式只需要處理的功能就好.沒有必要幫user return heap
04/30 15:17, 54F

04/30 15:19, , 55F
空間.但是之前在找glib的hashtable時.我的確有看到這種
04/30 15:19, 55F

04/30 15:20, , 56F
做法.你的感想跟我剛剛結束實習訓練來到公司一樣
04/30 15:20, 56F

04/30 15:22, , 57F
但是我的感覺是這民族真的很喜歡硬做.然後哪天爆了
04/30 15:22, 57F

04/30 15:23, , 58F
才推來推去. 就像我那個只喜歡享受完成的同事一樣
04/30 15:23, 58F

04/30 15:23, , 59F
不是很有藝術的人
04/30 15:23, 59F

04/30 15:23, , 60F
樓上讓我想起 DirectX 很愛幫 user return heap XDD
04/30 15:23, 60F

04/30 16:46, , 61F
其實return heap然後再提供xxx_free()之類的作法還滿常
04/30 16:46, 61F

04/30 16:47, , 62F
見的, 一些常見library或國外知名公司的SDK都有 :/
04/30 16:47, 62F

04/30 17:11, , 63F
linux有goto 是因為linus討厭cpp XDD
04/30 17:11, 63F

04/30 20:51, , 64F
話說我到現在還是不知道怎麼正確的使用C++ exception...
04/30 20:51, 64F

04/30 20:55, , 65F
連超哥都... 那我... (倒
04/30 20:55, 65F

04/30 20:56, , 66F
樓上少來!!
04/30 20:56, 66F
※ 編輯: calais007 來自: 114.37.131.117 (04/30 23:37)

04/30 23:38, , 67F
glibc的確滿多這樣的東西啦,我其實也只是抱怨一下而已
04/30 23:38, 67F

04/30 23:39, , 68F
因為人都有不擅長和擅長,應該用最簡單不會出錯的方法解
04/30 23:39, 68F

04/30 23:39, , 69F
Simple is beauty不是嗎?
04/30 23:39, 69F
※ 編輯: calais007 來自: 114.37.131.117 (04/30 23:40)

05/01 00:46, , 70F
那 strdup 是怎麼來的..:P
05/01 00:46, 70F

05/01 16:40, , 71F
kiss原則其實是很難的.臺灣人學到美國的隨性.卻沒學到
05/01 16:40, 71F

05/01 16:41, , 72F
其他優點.不過是題外話.講真的.c++到底要怎麼解決好
05/01 16:41, 72F

05/01 16:43, , 73F
要問問超哥和版主
05/01 16:43, 73F

05/01 23:50, , 74F
....樓上應該不是在叫我吧 (飄走)
05/01 23:50, 74F

05/02 10:30, , 75F
就是樓上那個想飄走的
05/02 10:30, 75F
文章代碼(AID): #1Fd0JQmX (C_and_CPP)
文章代碼(AID): #1Fd0JQmX (C_and_CPP)