2010年8月16日 星期一

最佳化對 Singleton 的影響

取代全域物件,使用 Singleton 是個不錯的觀念,但在 Singleton 的類別經常伴隨著一個 member function 叫作


volatile (class name) *pInst = NULL;

(class name*) GetInstance()
{
  if(pInst == NULL)
  {
    pInst = new (class name);
    return pInst;
  }
};


但 pInst = new (class name); 這一行指令卻包含了 3 個動作…
1. 產生所需記憶體空間
2. 建構此 class
3. 將1所產生的記憶體位置給 pInst

問題就來了,2 和 3 在最佳化時可能被對調,這時可以利用一些方式拆解此行,即是利用某些指令始其不被最佳化,這類的指令被稱為 barrier,在 barrier 上方的指令將不會被做最佳化改變執行順序。


volatile (class name) *pInst = NULL;

(class name*) GetInstance()
{
  if(pInst == NULL)
  {
    (class name*) ptemp = new (class name);
    // 加入 barrier 指令
    pInst = ptemp;
    return pInst;
  }
};

沒有留言:

張貼留言