2014-02-10 514 views
0
Dictionary::Dictionary() { 
    ifstream infile; 
    infile.open("words"); 
    string wread; 
    while(getline(infile,wread)){ 
     wordset.insert(wread); 
     vector<string> st =Read::Trigrams(wread); 
       //Word w(wread,st) stack försvinner när vi lämnar metoden. 
     words[wread.length()].push_back(Word(wread,st)); //stack eller heap 
    } 
    infile.close(); 
} 

這是一個類Dictionary的構造函數。 我想創建一個單詞對象並將其添加到矢量。 我應該寫 words [wread.length()]。push_back(Word(wread,st)); 或 W(wread,st); words [wread.length()]。push_back(w); w將被分配在堆棧上,當我們離開構造函數時它將被刪除。對象分配在堆棧或堆C++

+1

它沒有區別,它們都被分配在堆棧上。 –

+1

其實你應該使用'emplace_back'來提高性能和清晰度。 – Xarn

+0

@HansPassant標準沒有具體說明,但實際上你是正確的。具有_automatic_存儲時間的對象幾乎總是分配在堆棧上。然而,一個實現可能會選擇在堆上分配,因爲生命週期仍然是自動的。 – Mgetz

回答

1

在C++ 11中,第一種形式push_back(Word());會更有效率,iff Word有一個移動構造函數。不管怎樣,第二種形式都會複製。

功能明智,兩者都是等效的。第二個污染範圍,第一個沒有。第一個更有可能被有效地優化,第二個不是。

除非受後向兼容性的限制,否則應使用vector::emplace_back並傳遞值T或其構造函數之一的參數。

+0

但如果你推棧上創建的obj當構造函數完成時會發生什麼? – user2975699

+0

@ user2975699:它被複制到容器中。當構造函數完成時,本地實例將被銷燬,但容器中的副本將是安全的。 –

+0

@ user2975699當您push_back對象時,將創建一個副本並將其保存到向量中。已從中複製的值被銷燬。 – pmr

0

您提到的任何形式都不會在堆上分配。要在堆上分配你會一般使用new關鍵字

new Word() 

還有其他的辦法來分配在堆上,包括std::make_shared。但是你的樣本中沒有使用。僅使用Word()將在堆棧上分配

+0

你也可以通過調用'std :: make_shared'而不是'new'來在堆上分配對象。 –

1

執行此操作的「正確」方法是使用emplace_back,它將就地構建Word,即使移動也不會移除。

請注意emplace_back採用與對象的構造函數相同的參數。

+0

你應該提到這是一個C++ 11特性。 – paddy