在堆栈或堆c ++上分配的对象

时间:2014-02-10 21:44:53

标签: 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的构造函数。 我想创建一个单词对象并将其添加到矢量。 我应该写 。字[wread.length()]的push_back(字(wread,ST)); 要么 字w(wread,st); 。字[wread.length()]的push_back(W); w将在堆栈上分配,当我们离开构造函数时它将被删除。

3 个答案:

答案 0 :(得分:1)

在C ++ 11中,如果push_back(Word());具有移动构造函数,则第一种形式Word将更有效。第二种形式无论如何都会复制。

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

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

答案 1 :(得分:1)

“正确”的方法是使用emplace_back,它将就地构建Word,甚至删除移动。

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

答案 2 :(得分:0)

您提到的两种表单都不会在堆上分配。要在堆上分配,您通常会使用new关键字

new Word()

还有其他方法可以在堆上分配std::make_shared。但是您的样本中没有使用任何内容。简单地使用Word()将在堆栈上分配