2013-02-12 70 views
0

我是C++中的新成員,並嘗試編寫緩存模擬器。二級緩存的構造是用參數聲明類對象而不使用if ... else

CACHE (int, int, int, int, CACHE *); //declare 

,並在main(),我想根據一些變量來創建對象:

int main() 
{ 
     if (L2_size == 0)  //only one level of cache 
     { 
     CACHE L1(L1_size, blocksize, L1_assoc, inclusion, 0); 
     } 
     else      //2 level of caches 
     { 
     CACHE L2(L2_size, blocksize, L2_assoc, inclusion, 0); 
     CACHE L1(L1_size, blocksize, L1_assoc, inclusion, &L2); 
     } 
} 

這樣做的問題是,我不能夠訪問L1和L2,因爲它們的範圍在...內。

此外,我試過使用? :運營商實施此,仍然得到錯誤:

三元運算符不匹配。

有沒有辦法做到這一點?謝謝!

+3

包含如何使用'L2'和'L1'的示例。例如,如果'L2_size == 0',沒有'L2',那麼試圖使用'L2'的代碼應該發生什麼?或者這只是關於'L1'? – Yakk 2013-02-12 20:37:35

+0

你看過這篇文章嗎? http://stackoverflow.com/questions/1917718/are-multiple-conditional-operators-in-this-situation-a-good-idea – 2013-02-12 20:49:30

+0

如果L2_size == 0,沒有對象的二級緩存 – ARGOS 2013-02-12 21:06:21

回答

1

事情是這樣的,也許:

CACHE *L2 = 0; 
    CACHE *L1 = 0; 


    if (L2_size) 
    { 
     L2 = new CACHE(L2_size, blocksize, L2_assoc, inclusion, 0); 
    } 
    L1 = new CACHE(L1_size, blocksize, L1_assoc, inclusion, L2); 

我敢肯定還有其他的可能性。

+0

謝謝Mats。根據你的代碼,L1似乎總是指向L2。 – ARGOS 2013-02-12 21:13:57

+0

+1,而@ARGOS則不是。除非非零性質的L2_size創建新的CACHE並將其分配給'* L2',否則'* L2'爲0(空)。如果'L2_size'爲零,創建L1時'* L2'將爲NULL,正是你想要的。 – WhozCraig 2013-02-12 21:52:06

+0

@WhozCraig,你是對的,謝謝! – ARGOS 2013-02-13 00:46:04

0

您可以在if語句之前使用容器,如std::liststd::vector,並且只需按照需要push_back儘可能多的CACHE對象。

例子:

int main() 
    { 
     std::list<CACHE> caches; 
     if (L2_size == 0) 
     { 
      caches.push_front(CACHE(L1_size, blocksize, L1_assoc, inclusion, 0)); 
     } 
     else 
     { 
      caches.push_front(CACHE(L2_size, blocksize, L2_assoc, inclusion, 0); 
      caches.push_front(CACHE(L1_size, blocksize, L1_assoc, inclusion, &(*caches.begin()); 
     } 
    } 

無論使用哪種方法,這個想法是你的if語句之前創建堆棧變量(listpointer,或其他),使之保持在範圍內。

+0

@Mats編輯。新版本有什麼好處?它完成這項工作,儘管它只適用於兩級緩存場景,但這正是OP想要的。 – JBentley 2013-02-12 21:01:05

+0

@Mats Petersson,L2的地址傳遞給L1,L1中有一個CACHE指針,指向L2 – ARGOS 2013-02-12 21:11:09

+0

@ARGOS Mats指的是我的預編輯版本,忽略將L2地址傳遞給L1。 – JBentley 2013-02-12 21:15:51