[問題] 成員變數一開始宣告成空指標有比較快嗎?

看板C_and_CPP (C/C++)作者 (ResolaQQ)時間10年前 (2015/12/17 19:08), 編輯推噓4(4017)
留言21則, 7人參與, 最新討論串1/1
程式碼(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

12/17 19:52, , 1F
不null總有一天會出錯呀
12/17 19:52, 1F

12/17 19:57, , 2F
NULL或-1都是很常用於物件沒有的情況
12/17 19:57, 2F

12/17 19:58, , 3F
含數中的變數如果沒有初始化,回傳此變數會變亂數
12/17 19:58, 3F

12/17 20:10, , 4F
不是啦,我是指在 init 的時候就直接 new 好
12/17 20:10, 4F

12/17 20:11, , 5F
不要等到要用的時候再 new,像 Bind 的時候
12/17 20:11, 5F

12/17 20:51, , 6F
假設DoBind的使用頻率沒有很高,且wxList是個很大的物件
12/17 20:51, 6F

12/17 20:53, , 7F
這樣可以降低wxEvtHandler的初始化時間,整體來說是好的
12/17 20:53, 7F

12/17 21:43, , 8F
反過來說如果你之後想讓 wxEvtHandler 被多個 threads
12/17 21:43, 8F

12/17 21:44, , 9F
使用, 這個寫法會造成 race condition, 不是完全無害...
12/17 21:44, 9F

12/17 23:14, , 10F
感謝各位,我自己寫了幾個小測試,省記憶體是蠻明顯的
12/17 23:14, 10F

12/17 23:15, , 11F
但現在記憶體又不貴,至少也要到100萬個物件才有感覺
12/17 23:15, 11F

12/17 23:16, , 12F
所以好像也沒必要特別省,速度部分則是完全無感
12/17 23:16, 12F

12/17 23:17, , 13F
不論是初始化時或啟動時都是一瞬間就好了
12/17 23:17, 13F

12/17 23:18, , 14F
我先用比較懶的寫法試試看,有記憶體爆炸的問題再改吧
12/17 23:18, 14F

12/18 01:32, , 15F
這種寫法其實就是非 RAII 式寫法, 而你所謂的 init 時 new
12/18 01:32, 15F

12/18 01:32, , 16F
正是 RAII 這個觀念, 各有優缺點就是了
12/18 01:32, 16F

12/18 01:33, , 17F
RAII 的優點其實不在於速度而在於資源管理
12/18 01:33, 17F

12/18 02:09, , 18F
樓上感謝!! 之前翻RAII的解說文看不太懂 把原PO的問題
12/18 02:09, 18F

12/18 02:10, , 19F
套上去後馬上就理解精神了!!
12/18 02:10, 19F

12/18 13:19, , 20F
看來我還是照 RAII 的精神寫好了,似乎會比較好
12/18 13:19, 20F

12/18 14:32, , 21F
考古 精華區 z-12-4-2-7 --> [心得] The RAII Idiom
12/18 14:32, 21F
文章代碼(AID): #1MSfUV9R (C_and_CPP)
文章代碼(AID): #1MSfUV9R (C_and_CPP)