[分享] C/C++語言工作上的心得
各位板友大家好
小弟工作經驗約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
04/28 23:02, 1F
→
04/28 23:02, , 2F
04/28 23:02, 2F
→
04/28 23:05, , 3F
04/28 23:05, 3F
推
04/28 23:08, , 4F
04/28 23:08, 4F
→
04/28 23:09, , 5F
04/28 23:09, 5F
→
04/28 23:10, , 6F
04/28 23:10, 6F
→
04/28 23:11, , 7F
04/28 23:11, 7F
→
04/28 23:41, , 8F
04/28 23:41, 8F
推
04/28 23:44, , 9F
04/28 23:44, 9F
→
04/28 23:45, , 10F
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
04/29 00:01, 13F
→
04/29 00:02, , 14F
04/29 00:02, 14F
推
04/29 00:12, , 15F
04/29 00:12, 15F
推
04/29 00:19, , 16F
04/29 00:19, 16F
推
04/29 00:20, , 17F
04/29 00:20, 17F
→
04/29 00:20, , 18F
04/29 00:20, 18F
→
04/29 00:21, , 19F
04/29 00:21, 19F
→
04/29 00:21, , 20F
04/29 00:21, 20F
→
04/29 00:21, , 21F
04/29 00:21, 21F
推
04/29 00:22, , 22F
04/29 00:22, 22F
→
04/29 00:24, , 23F
04/29 00:24, 23F
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)
推
04/29 00:28, , 24F
04/29 00:28, 24F
推
04/29 00:30, , 25F
04/29 00:30, 25F
推
04/29 01:11, , 26F
04/29 01:11, 26F
→
04/29 01:12, , 27F
04/29 01:12, 27F
→
04/29 01:12, , 28F
04/29 01:12, 28F
→
04/29 01:14, , 29F
04/29 01:14, 29F
推
04/29 02:19, , 30F
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
04/29 08:00, 33F
→
04/29 08:01, , 34F
04/29 08:01, 34F
→
04/29 08:24, , 35F
04/29 08:24, 35F
推
04/29 08:25, , 36F
04/29 08:25, 36F
→
04/29 08:26, , 37F
04/29 08:26, 37F
→
04/29 08:26, , 38F
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
04/29 13:20, 40F
→
04/29 13:20, , 41F
04/29 13:20, 41F
推
04/29 17:30, , 42F
04/29 17:30, 42F
推
04/30 09:57, , 43F
04/30 09:57, 43F
推
04/30 10:41, , 44F
04/30 10:41, 44F
→
04/30 10:41, , 45F
04/30 10:41, 45F
→
04/30 10:42, , 46F
04/30 10:42, 46F
推
04/30 10:43, , 47F
04/30 10:43, 47F
推
04/30 10:45, , 48F
04/30 10:45, 48F
推
04/30 11:45, , 49F
04/30 11:45, 49F
→
04/30 11:58, , 50F
04/30 11:58, 50F
→
04/30 15:13, , 51F
04/30 15:13, 51F
→
04/30 15:14, , 52F
04/30 15:14, 52F
→
04/30 15:16, , 53F
04/30 15:16, 53F
→
04/30 15:17, , 54F
04/30 15:17, 54F
→
04/30 15:19, , 55F
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
04/30 15:23, 60F
→
04/30 16:46, , 61F
04/30 16:46, 61F
→
04/30 16:47, , 62F
04/30 16:47, 62F
推
04/30 17:11, , 63F
04/30 17:11, 63F
→
04/30 20:51, , 64F
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
04/30 23:38, 67F
→
04/30 23:39, , 68F
04/30 23:39, 68F
→
04/30 23:39, , 69F
04/30 23:39, 69F
※ 編輯: calais007 來自: 114.37.131.117 (04/30 23:40)
推
05/01 00:46, , 70F
05/01 00:46, 70F
→
05/01 16:40, , 71F
05/01 16:40, 71F
→
05/01 16:41, , 72F
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
討論串 (同標題文章)