原始問題是我問的,發問於 ptt [問題] 檔案深度搜尋 BFS / DFS ,這裡先做個 note。
先強調一下,裡面的資料夾搜尋原始碼是有點問題的,沒做好防呆措施。
原主題蠻快就解決疑問了,檔案深度搜尋,BFS / DFS 效能哪個優沒說得準。
重點是在於裡面的「衍生問題」, 留下不少作法討論,
主要是想將 printf / puts / putchar 之類的函式,以 #define 方式消掉,
一開始筆者很天兵的作法
#ifdef NO_OUTPUT
#define printf //
#define puts //
#define putchar //
#endif
當然是有問題的,而且蠻多情況會出包。
推文裡有得到不少解答,有時間的時候再想一下是不是有其它較好的作法,
當然再下去又回到之前的 dprintf 問題,這裡單純先做個 note。
文章標籤
全站熱搜

比較不會出問題的做法: #define printf (1)? 0 : printf 而且在執行期不會有額外開銷。 http://novus.pixnet.net/blog/post/27504600 另naive BFS/DFS 的時間純粹看問題特性+運氣,沒什麼好比的
blog 我連上去看了,中後半段的 macro 還真的是讓我繳盡腦汁。 BFS / DFS 在這問題一度讓我思考是不是太過頻繁做記憶體配置(malloc) 與字串複製,不過不複製的話也沒辦法保留資訊下來,後來認為應是運氣成份居多了,再次感謝您的回答。
不好意思,剛剛一直沒有閱讀大作,直到看到樓上回覆,才想點進去看一下程式碼。雖然沒有詳細追蹤流程,不過立刻查覺一個潛在問題。 FString *Queue = (FString*)malloc(sizeof(*Queue) * QSize); if(hFind==INVALID_HANDLE_VALUE){ printf("FindFirstFile Error %d\n", GetLastError()); return ; } free(Queue); 不知道你有沒有發現,只要 hFind 有錯,馬上就會 memory leak。資源釋放一定要涵蓋全部路徑。有一個簡單的 idiom 專門解決這種問題,名字我忘了。 void Algo(..whatever..) { res = malloc(..); AlgoImpl(..whatever.., res); free(res); }
這個 leak 還真的是忘了清。模型讓我想了一下才想到是什麼意思。 應是會先 call Algo, 裡面專門做 heap 管理, 而 AlgoImpl 就不管 heap (除了不夠用 realloc 之外), 專職在演算法之重心。 最後謝謝指正與建議 :)