gpt4 book ai didi

c++ - 列表和列表元素,存储在哪里?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:04 26 4
gpt4 key购买 nike

给定这段代码:

#include <list>
(void) someFunction(void) {
list <int> l;
l.push_back(1);
}
  • 列表的元素存储在哪里?堆?堆?
  • 我该如何凭经验检查值是在堆栈中还是在堆中?
  • 这个函数可以返回列表吗? 已编辑 如果我将函数声明为列表,函数是否可以毫无问题地返回列表?

示例(返回列表):

#include <list>
list<int> someFunction(void) {
list <int> l;
l.push_back(1);
}

...
l2 = someFunction();
l2.push_back(2);

最佳答案

Where are the elements of the list stored? Stack? Heap?

列表元素存储在堆上。您可以在调试器的 push_back 方法调用之后看到这一点。最容易看到的是存储对象而不是 POD 类型,并记录构造函数。在复制它们时,您需要一个复制构造函数。分配发生在模板参数分配器中,您可以指定或不指定它将与默认堆分配一起使用。

How can I do to empirically check that values are in stack or heap?

您可以使用堆栈中的 push_back 元素进行检查:

std::list<int> my_list;
int a = 10;
my_list.push_back(a);
a = 11;
assert(*my_list.begin() == 10);

This function can returns the list?

在 C++ 中,有两种传递数据的方法:通过引用或通过值。如果你的功能看起来像这样,

list<int> func()
{
list<int> res;
res.push_back(10);
return res;
}

那么您将按值传递列表,这意味着编译器将调用列表的复制构造函数,该构造函数还会复制列表中的所有值。当函数返回时,在复制列表后,将调用“res”列表的析构函数,释放其所有元素。但是,如果您这样做:

list<int>& func()
{
list<int> res;
res.push_back(10);
return res;
}

当您返回对“res”列表的引用时,您的代码将失败,该列表将在其作用域结束时被销毁,因此您的引用将无效。

第一个解决方案的问题可能是性能。您也可以在不调用复制构造函数的情况下这样做:

void func(list<int>& res)
{
res.push_back(10);
}

list<int> list_to_fill;
func(list_to_fill);

在这种情况下,没有复制,而且应该更快,因为只有一个列表创建。

关于c++ - 列表和列表元素,存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8882442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com