对象分配在堆栈或堆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++
在C++ 11中,第一种形式push_back(Word());
会更有效率,iff Word
有一个移动构造函数。不管怎样,第二种形式都会复制。
功能明智,两者都是等效的。第二个污染范围,第一个没有。第一个更有可能被有效地优化,第二个不是。
除非受后向兼容性的限制,否则应使用vector::emplace_back
并传递值T
或其构造函数之一的参数。
但如果你推栈上创建的obj当构造函数完成时会发生什么? – user2975699
@ user2975699:它被复制到容器中。当构造函数完成时,本地实例将被销毁,但容器中的副本将是安全的。 –
@ user2975699当您push_back对象时,将创建一个副本并将其保存到向量中。已从中复制的值被销毁。 – pmr
您提到的任何形式都不会在堆上分配。要在堆上分配你会一般使用new
关键字
new Word()
还有其他的办法来分配在堆上,包括std::make_shared
。但是你的样本中没有使用。仅使用Word()
将在堆栈上分配
你也可以通过调用'std :: make_shared'而不是'new'来在堆上分配对象。 –
执行此操作的“正确”方法是使用emplace_back
,它将就地构建Word,即使移动也不会移除。
请注意emplace_back
采用与对象的构造函数相同的参数。
你应该提到这是一个C++ 11特性。 – paddy
它没有区别,它们都被分配在堆栈上。 –
其实你应该使用'emplace_back'来提高性能和清晰度。 – Xarn
@HansPassant标准没有具体说明,但实际上你是正确的。具有_automatic_存储时间的对象几乎总是分配在堆栈上。然而,一个实现可能会选择在堆上分配,因为生命周期仍然是自动的。 – Mgetz