作者:
ResolaQQ (ResolaQQ)
2015-12-17 19:08:11程式碼(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,才能開始對物件存取?
雖然會節省一點點空間,但是這樣寫實在很麻煩,也不清楚對速度的影響是好是壞
請問有其他理由支持這種寫法嗎?
不null總有一天會出錯呀NULL或-1都是很常用於物件沒有的情況含數中的變數如果沒有初始化,回傳此變數會變亂數
作者:
ResolaQQ (ResolaQQ)
2015-12-17 20:10:00不是啦,我是指在 init 的時候就直接 new 好不要等到要用的時候再 new,像 Bind 的時候
作者:
Caesar08 (Caesar)
2015-12-17 20:51:00假設DoBind的使用頻率沒有很高,且wxList是個很大的物件這樣可以降低wxEvtHandler的初始化時間,整體來說是好的
作者:
uranusjr (â†é€™äººæ˜¯è¶…級笨蛋)
2015-12-17 21:43:00反過來說如果你之後想讓 wxEvtHandler 被多個 threads使用, 這個寫法會造成 race condition, 不是完全無害...
作者:
ResolaQQ (ResolaQQ)
2015-12-17 23:14:00感謝各位,我自己寫了幾個小測試,省記憶體是蠻明顯的但現在記憶體又不貴,至少也要到100萬個物件才有感覺所以好像也沒必要特別省,速度部分則是完全無感不論是初始化時或啟動時都是一瞬間就好了我先用比較懶的寫法試試看,有記憶體爆炸的問題再改吧
作者:
LPH66 (-6.2598534e+18f)
2015-12-18 01:32:00這種寫法其實就是非 RAII 式寫法, 而你所謂的 init 時 new正是 RAII 這個觀念, 各有優缺點就是了RAII 的優點其實不在於速度而在於資源管理
作者:
overhead (overhead)
2015-12-18 02:09:00樓上感謝!! 之前翻RAII的解說文看不太懂 把原PO的問題套上去後馬上就理解精神了!!
作者:
ResolaQQ (ResolaQQ)
2015-12-18 13:19:00看來我還是照 RAII 的精神寫好了,似乎會比較好
作者: yvb 2015-12-18 14:32:00
考古 精華區 z-12-4-2-7 --> [心得] The RAII Idiom