2011-11-30 160 views
3

我有一個類:「Class myclass = Class()」是否浪費資源?

class Cat { 
    Cat(); 
    Tail longTail; 
} 

我不知道要寫構造爲它取之有道。我不想讓longTail成爲非相關原因的指針。

Cat::Cat() : longTail(length) {...} 

那個不適合,因爲長度是在構造函數中計算的,基於創建時的靜態成員值; (上游業務不佳);


問題是

Cat::Cat() 
{ 
    int length; 
    ... 
    longTail = Tail(length); 
} 

多少次創造和尾的複製對象發生的呢?它們對於創建和複製都是CPU昂貴的,我需要數千只貓。在我看來,這個構造函數首先創建長尾默認對象,它創建於分配權NONAME尾部對象後,再運行操作=上長尾和NONAME 。我對嗎?如果是的話,我應該如何編寫它來保存CPU?我再說一遍:longTail需要一個參數,即在構造函數中計算出來的,並且我不能編輯類。

+1

您是否真的測試過效率問題? –

+0

每個尾都有一個float數組[80] [80],我正在爲嵌入式編寫。是的,對於我可能編輯的部件的每個CPU週期來說,這是一個問題; –

回答

9

在您的第二個版本中,您的Tail對象將在構造函數的主體運行之前被默認初始化。在主體中創建第二個對象並將其分配給第一個對象。

爲了能夠在初始化列表正確的建設,你可以包裝參數的計算在一個靜態成員函數(因爲,如你所說,它僅依賴於靜態成員):

class Cat { 
public: 
    Cat() : longTail(calculateLength()) {...} 

private: 
    static int calculateLength() {} 
+0

班裏面的Cat :: Cat()'? – Nawaz

+0

@Nawaz:複製粘貼錯誤 - 修復。 –

+0

「caluclateLength」! – curiousguy

0

在我看來,這個構造函數首先在longTail中創建一個默認的Tail對象,然後在賦值的右邊創建noname Tail對象,然後在longTail和noname Tail上運行operator =。我對嗎?

是的。

如果是的話,應該怎麼寫才能保存CPU?

可能的替代:不分配給longTail,填補longTail到位:

 
longTail.resize (length); 
// or 
longTail.reserve (length); 
longTail.append (x). 

你有真實的數據集來測試你的代碼?

您是否嘗試過配置您的代碼?

+1

你認爲'Tail'有方法'resize','reserve'和'append' - 怎麼樣? –

+0

正是這個問題。長度只在構造函數中設置,我不能以任何方式編輯Tail類。 –

+0

貓可能沒有包含指針,以致於某些人在'新'操作符中進行內存加密的好主意。 –