看板 C_and_CPP 關於我們 聯絡資訊
程式碼(Code):(請善用置底文網頁, 記得排版) void wxEvtHandler::DoBind(int id, int lastId, wxEventType eventType, wxEventFunctor *func, wxObject *userData) { // 省略 if (!m_dynamicEvents) m_dynamicEvents = new wxList; // 省略 } bool wxEvtHandler::DoUnbind(int id, int lastId, wxEventType eventType, const wxEventFunctor& func, wxObject *userData) { if (!m_dynamicEvents) return false; wxList::compatibility_iterator node = m_dynamicEvents->GetFirst(); while (node) { // 省略 } return false; } 補充說明(Supplement): 像上面程式碼中的 m_dynamicEvents,一開始是 NULL,等到 DoBind 的時候才 new 出來 可是這樣寫,之後每個要使用 m_dynamicEvents 的函式(如 DoUnbind) 不就都要先檢查一次 m_dynamicEvents 是否等於 NULL,才能開始對物件存取? 雖然會節省一點點空間,但是這樣寫實在很麻煩,也不清楚對速度的影響是好是壞 請問有其他理由支持這種寫法嗎? -- 放著養蚊子的部落格 http://resolaqq.blogspot.tw -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.230.17.168 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1450350495.A.25B.html
stupid0319: 不null總有一天會出錯呀 12/17 19:52
stupid0319: NULL或-1都是很常用於物件沒有的情況 12/17 19:57
stupid0319: 含數中的變數如果沒有初始化,回傳此變數會變亂數 12/17 19:58
ResolaQQ: 不是啦,我是指在 init 的時候就直接 new 好 12/17 20:10
ResolaQQ: 不要等到要用的時候再 new,像 Bind 的時候 12/17 20:11
Caesar08: 假設DoBind的使用頻率沒有很高,且wxList是個很大的物件 12/17 20:51
Caesar08: 這樣可以降低wxEvtHandler的初始化時間,整體來說是好的 12/17 20:53
uranusjr: 反過來說如果你之後想讓 wxEvtHandler 被多個 threads 12/17 21:43
uranusjr: 使用, 這個寫法會造成 race condition, 不是完全無害... 12/17 21:44
ResolaQQ: 感謝各位,我自己寫了幾個小測試,省記憶體是蠻明顯的 12/17 23:14
ResolaQQ: 但現在記憶體又不貴,至少也要到100萬個物件才有感覺 12/17 23:15
ResolaQQ: 所以好像也沒必要特別省,速度部分則是完全無感 12/17 23:16
ResolaQQ: 不論是初始化時或啟動時都是一瞬間就好了 12/17 23:17
ResolaQQ: 我先用比較懶的寫法試試看,有記憶體爆炸的問題再改吧 12/17 23:18
LPH66: 這種寫法其實就是非 RAII 式寫法, 而你所謂的 init 時 new 12/18 01:32
LPH66: 正是 RAII 這個觀念, 各有優缺點就是了 12/18 01:32
LPH66: RAII 的優點其實不在於速度而在於資源管理 12/18 01:33
overhead: 樓上感謝!! 之前翻RAII的解說文看不太懂 把原PO的問題 12/18 02:09
overhead: 套上去後馬上就理解精神了!! 12/18 02:10
ResolaQQ: 看來我還是照 RAII 的精神寫好了,似乎會比較好 12/18 13:19
yvb: 考古 精華區 z-12-4-2-7 --> [心得] The RAII Idiom 12/18 14:32