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;
}
};
沒有留言:
張貼留言