C++将类对象推送到容器时在堆栈或堆中创建类对象

C++ create class object in stack or heap when push it to container?

本文关键字:对象 堆栈 创建 C++      更新时间:2023-10-16

我已经阅读了这个SO问题,什么时候最好使用堆栈而不是堆,反之亦然?堆栈的大小似乎有限,因此您无法在堆栈中分配大型对象。

我有一些代码,可以将对象推送到容器,请参阅在线 ide 上的此链接,http://cpp.sh/9xxea

那么,我应该更喜欢一个而不是另一个吗?

void AddPerson(const CPerson& p)
{
    std::cout << "push back" << std::endl;
    persons.push_back(p);
    std::cout << "size " << persons.size() << std::endl;
}
void AddPerson()
{
    CPerson cp(10, "kit");
    std::cout << "push back" << std::endl;
    //I know push_back will copy the element and push the copied object(which is created on heap ?), when function returns, cp will be "freed".
    //so this function is better than function AddPerson(const CPerson&) ?
    persons.push_back(cp);
    std::cout << "size " << persons.size() << std::endl;
}
std::vector<CPerson> persons;

那么,我应该更喜欢一个而不是另一个吗?

我建议根本不单独创建对象。既不堆叠,也不堆。将对象直接创建到向量中:

 persons.emplace_back(10, "kit");

也就是说,CPerson非常小,你可以在堆栈上容纳数十万个(或更少,在很大程度上取决于你的堆栈的大小(,所以我不会担心那个是否这样做。