看板 C_and_CPP 關於我們 聯絡資訊
各位板友大家好 小弟工作經驗約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)
james732:我覺得第四點比較不奇怪,有時使用者不用管struct內容 04/28 23:02
james732:只要有指標跟正確的setter/getter就可以操作了 04/28 23:02
james732:另外有些環境要用C++會挺麻煩的,譬如EDK2這種東西 04/28 23:05
purpose:一邊是有紀律有組織,一邊是得過且過,惡性循環 04/28 23:08
purpose:warning 多很有可能原本是 VC6 時期寫,換新編譯器後... 04/28 23:09
james732:話說有的時間的話我也好想整頓手邊的程式碼,可是.... 04/28 23:10
james732:還是早點下班才是真的,上星期平均十一點離開公司 orz 04/28 23:11
YTsungL:XXX_type myType= *(XXX_type*) struct; ? 04/28 23:41
littleshan:其實singleton就是global variable 04/28 23:44
diabloevagto:早點下班才是真的xdd 04/28 23:45
diabloevagto:你整頓了沒產能反而是你被唸 04/28 23:45
※ 編輯: calais007 來自: 114.37.135.55 (04/28 23:53)
firose:第三點真的很妙 04/28 23:54
YTsungL:寫kernel module的話不用C++很正常吧? 前同事不愛用STL則 04/29 00:01
YTsungL:是因為他覺得performance不好, 所以見人見智囉 04/29 00:02
Bencrie:3 也不見得會 leak 吧 ... 雖然那個 void* 會誤導人 XDD 04/29 00:12
Bencrie:7 的話,我是覺得 C 比較簡單 ... 雖然寫 code 的人要負 04/29 00:19
purpose:out_b 那個註解的英文我看不太懂,是他寫錯還是我有問題? 04/29 00:20
Bencrie:更多的責任。 04/29 00:20
purpose:回傳一個 allocate space,這 space 是要怎樣 return 04/29 00:21
Bencrie:他要把 void* cast 成某個東西的** 吧 XD 04/29 00:21
purpose:我知道他想幹嘛,但那英文總覺得很怪 04/29 00:21
Bencrie:allocated ? 04/29 00:22
calais007:傳一個null pointer進去,出來是有memory space的 04/29 00:24
http://stackoverflow.com/questions/105477/c-pointer-q-malloc-inside-a-fn-call-appears-to-be-getting-freed-on-return-of-fn ※ 編輯: calais007 來自: 114.37.135.55 (04/29 00:27)
flydragon198:http://tinyurl.com/89wsvwq 幫縮 04/29 00:28
Bencrie:傳 NULL 進去沒 segfault 的話就是程式有問題 XD 04/29 00:30
cobrasgo:第三個不會很奇怪,你把c寫的很oo的話,當你new一個obj的 04/29 01:11
cobrasgo:時候就會在newObj裡malloc。當然要有對應的function來 04/29 01:12
cobrasgo:做類似delete的動作,把newObj malloc的收乾淨 04/29 01:12
cobrasgo:拍謝我看錯了囧 04/29 01:14
sawang:Embedded sytem中開發Kernel module的話,memory需要計較 04/29 02:19
sawang:記憶體能省就省,我個人偏見覺得是個好習慣啦 04/29 02:21
damody:同意,台灣的品質快輸對岸了 04/29 02:36
tinlans:不用 STL 是因為 template instances 一多的話會吃記憶體 04/29 08:00
tinlans:。不過這也只有偉大的鬼島做出來的硬體需要擔心這... 04/29 08:01
in09:推B大,我也覺得C比較簡單,有些功能簡單架構單純的,用C比較好 04/29 08:24
saxontai:呃,記憶體是要錢的。這種成本考量不是只有台灣的 design 04/29 08:25
saxontai:house 才會這樣,國內外都一樣。比較的可怕的是對硬體資 04/29 08:26
saxontai:源的使用毫無節制的 programmer >_< 04/29 08:26
saxontai: ^那 04/29 08:42
同意在某些情形記憶體要斤斤計較 像寫ASIC的firmware或是kernel module 但這些東西我是在AP層看到的 process的stack本身就很夠用了 擺在那邊不用改用heap反而跟其他process搶memory 這樣有比較省?也許我的觀念錯誤吧. ※ 編輯: calais007 來自: 114.37.135.55 (04/29 09:52)
yoco315:我覺得有的公司不用C++的原因,是因為怕找不到會C++的人 04/29 13:20
yoco315:要找C跟C++的人才,前者真的簡單很多... 04/29 13:20
saxontai:我是針對推文而推文的,而不是原 PO 的文章哦。XD 04/29 17:30
EdisonX:推! 蠻想知道goto用法長怎樣的,目前只在fsm裡看過.. 04/30 09:57
purpose:若有個 TranslateToTxt(char *srcStr, char *outFile) 04/30 10:41
purpose:翻譯後的字串放在 malloc(xx) 建的記憶體裡,然後要輸出到 04/30 10:41
purpose:檔案時失敗,可能用 goto 跳到函數結尾,用 free 清記憶體 04/30 10:42
tropical72:感謝p大補充. 04/30 10:43
iWRZ:Linux 核心程式碼就有少許 goto 04/30 10:45
saxontai:goto在過往被妖魔化得很嚴重。妥善利用的話是個好物。 04/30 11:45
james732:Linux kernel的goto其實也不算少許了 04/30 11:58
angleevil:goto..在c++的地位會滿輕的.因為c++這邊有例外處理的 04/30 15:13
angleevil:議題. 04/30 15:14
angleevil:置於第三點,以前就有提醒我多參考strcpy得作法.一個lib 04/30 15:16
angleevil:函式只需要處理的功能就好.沒有必要幫user return heap 04/30 15:17
angleevil:空間.但是之前在找glib的hashtable時.我的確有看到這種 04/30 15:19
angleevil:做法.你的感想跟我剛剛結束實習訓練來到公司一樣 04/30 15:20
angleevil:但是我的感覺是這民族真的很喜歡硬做.然後哪天爆了 04/30 15:22
angleevil:才推來推去. 就像我那個只喜歡享受完成的同事一樣 04/30 15:23
angleevil:不是很有藝術的人 04/30 15:23
Bencrie:樓上讓我想起 DirectX 很愛幫 user return heap XDD 04/30 15:23
shadow0326:其實return heap然後再提供xxx_free()之類的作法還滿常 04/30 16:46
shadow0326:見的, 一些常見library或國外知名公司的SDK都有 :/ 04/30 16:47
johnlinvc:linux有goto 是因為linus討厭cpp XDD 04/30 17:11
james732:話說我到現在還是不知道怎麼正確的使用C++ exception... 04/30 20:51
loveme00835:連超哥都... 那我... (倒 04/30 20:55
james732:樓上少來!! 04/30 20:56
※ 編輯: calais007 來自: 114.37.131.117 (04/30 23:37)
calais007:glibc的確滿多這樣的東西啦,我其實也只是抱怨一下而已 04/30 23:38
calais007:因為人都有不擅長和擅長,應該用最簡單不會出錯的方法解 04/30 23:39
calais007:Simple is beauty不是嗎? 04/30 23:39
※ 編輯: calais007 來自: 114.37.131.117 (04/30 23:40)
freelancer:那 strdup 是怎麼來的..:P 05/01 00:46
angleevil:kiss原則其實是很難的.臺灣人學到美國的隨性.卻沒學到 05/01 16:40
angleevil:其他優點.不過是題外話.講真的.c++到底要怎麼解決好 05/01 16:41
angleevil:要問問超哥和版主 05/01 16:43
james732:....樓上應該不是在叫我吧 (飄走) 05/01 23:50
angleevil:就是樓上那個想飄走的 05/02 10:30