2016-03-29 94 views
0
class MyClass { 
    private: 
     unsigned int currentTimeMS; 
    public: 
     void update() { 
      currentTimeMS = getTimeMS(); 
      // ... 
     } 
}; 

class MyClass { 
    public: 
     void update() { 
      unsigned int currentTimeMS = getTimeMS(); 
      // ... 
     } 
}; 

update()調用主遊戲循環,所以在第二種情況下,我們獲得了很多分配操作(unsigned int currentTimeMS)。在第一種情況下,我們只得到一個分配並使用之前分配的變量。 哪個代碼更好用,爲什麼?有什麼更好的使用,爲什麼?

+1

這取決於。你需要其他地方的'currentTimeMS'變量嗎?某處你不能直接調用'getTimeMS'的地方? –

+1

問題中沒有足夠的代碼或內容來回答此問題。另外,你的標題嚴重嗎? – juanchopanza

+0

在第一個片段中,是'getTimeMS();'應該是'getTimeMS;'? – user463035818

回答

8

我推薦第二個變體,因爲它是無狀態變量的範圍較小。只有在您確實遇到性能問題時才使用第一個問題,而我認爲這不太可能。

如果您稍後不修改變量值,則還應考慮將其設置爲const,以便在代碼中表達此意圖併爲編譯器提供其他優化選項。

+2

你如何推薦?你不知道他在做什麼結果。它可能需要在其他地方使用。 –

+1

@afrogonabike:從他的代碼示例中我得出結論:該變量只用於'update()'方法。否則,他不會有兩種選擇。 –

+0

是的,我想這是真的。未知的是OP是否缺乏對類別聲明的基本理解,或者問題是否比這更深。 OP? –

0

在第一個示例中,您正在保存此類對象的狀態。在第二個,你不是,所以currentTime將會在即時更新()被調用時丟失。

真正由你來決定你需要哪一個。

0

第一種情況是定義一個成員變量,第二個是局部變量。基本類的東西。私有成員變量可用於該類中的任何函數(方法)。局部變量僅在聲明它的函數中可用。

1

這取決於您的需求。如果currentTimeMS只需要暫時update(),那麼一定要在那裏聲明它。 (在你的情況,#1選項

,如果它需要的類的實例值(即在其他一些方法的使用),那麼你就應該宣佈它作爲一個字段(在你的情況,#option1)。

0

哪個代碼更好用,爲什麼?

首先,所引用的代碼充其量只是一個微小的微型優化。除非必須,否則不要擔心這些事情。

事實上,這很可能是一種非優化。有時自動變量分配在堆棧上。堆棧分配速度非常快(有時甚至是空閒的)。沒有必要擔心。其他時候,編譯器會在這裏使用一個小的自動變量,例如unsigned int。沒有任何分配。

將該變量作爲該類的數據成員,並僅用於避免該分配的目的。訪問該變量涉及通過this指針。指針取消引用具有成本,可能遠遠超過向指針添加偏移量的成本。解除引用可能導致緩存未命中。更糟糕的是,每次引用變量時都可能會執行這種解引用。


也就是說,有時候最好創建數據成員僅用於避免各種成員函數中的自動變量。大型數組聲明爲本地自動變量可能會導致堆棧溢出。但是,請注意,使double big_array[2000][2000]成爲MyClass的數據成員將極有可能使MyClass類型的變量無法在某些函數中聲明爲局部自動變量。

通過在堆棧中放置大型數組而創建的問題的標準解決方案是將其分配到堆上。這導致另一個地方創建數據成員以避免局部變量可能是有益的。雖然堆棧分配非常快,但堆分配(例如,new)非常慢。重複調用的成員函數可能會使自動變量std::unique_ptr<double> big_array = std::make_unique<double>(2000*2000)成爲MyClass的數據成員。

請注意,以上都不適用於問題中的示例代碼。還要注意最後一個問題(使堆分配變量成爲數據成員以避免重複分配和釋放)意味着代碼必須通過this指針才能訪問該內存。在嚴格的代碼中,我有時被迫創建一個本地自動指針變量,如double* local_pointer = this->some_pointer_member,以避免重複遍歷this

相關問題