对象分配在堆栈或堆C++

问题描述:

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

在C++ 11中,第一种形式push_back(Word());会更有效率,iff Word有一个移动构造函数。不管怎样,第二种形式都会复制。

功能明智,两者都是等效的。第二个污染范围,第一个没有。第一个更有可能被有效地优化,第二个不是。

除非受后向兼容性的限制,否则应使用vector::emplace_back并传递值T或其构造函数之一的参数。

+0

但如果你推栈上创建的obj当构造函数完成时会发生什么? – user2975699

+0

@ user2975699:它被复制到容器中。当构造函数完成时,本地实例将被销毁,但容器中的副本将是安全的。 –

+0

@ user2975699当您push_back对象时,将创建一个副本并将其保存到向量中。已从中复制的值被销毁。 – pmr

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

new Word() 

还有其他的办法来分配在堆上,包括std::make_shared。但是你的样本中没有使用。仅使用Word()将在堆栈上分配

+0

你也可以通过调用'std :: make_shared'而不是'new'来在堆上分配对象。 –

执行此操作的“正确”方法是使用emplace_back,它将就地构建Word,即使移动也不会移除。

请注意emplace_back采用与对象的构造函数相同的参数。

+0

你应该提到这是一个C++ 11特性。 – paddy