[问题] 成员变量一开始宣告成空指标有比较快吗?

楼主: 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,才能开始对物件存取?
虽然会节省一点点空间,但是这样写实在很麻烦,也不清楚对速度的影响是好是坏
请问有其他理由支持这种写法吗?
作者: stupid0319 (征女友)   2015-12-17 19:52:00
不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

Links booklink

Contact Us: admin [ a t ] ucptt.com