Где элементы списка хранятся? Стек? Heap?
Элементы списка хранятся в куче. Вы можете увидеть это после вашего отладчика вниз при вызове метода push_back. Легче всего это хранить объекты, а не тип POD, и записывать конструктор. Вам понадобится конструктор копирования, поскольку они будут скопированы. Распределение происходит с помощью распределителя аргументов шаблона, который вы можете указать или не указывая, он будет идти с распределением кучи по умолчанию.
Как я могу сделать, чтобы эмпирически проверить, что значения находятся в стеке или куче?
Вы можете проверить это с помощью push_back элементов из стека:
std::list<int> my_list;
int a = 10;
my_list.push_back(a);
a = 11;
assert(*my_list.begin() == 10);
Эта функция может возвращает список?
В 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;
}
Вы код потерпит неудачу, как вы вернуть ссылку в свой список «Рес», который уже будет уничтожен в конце его объем, так что вы ссылка будет инвалид.
Проблема с первым решением может быть производительностью. Вы также можете сделать это без вызова конструктора копии, как это:
void func(list<int>& res)
{
res.push_back(10);
}
list<int> list_to_fill;
func(list_to_fill);
В этом случае нет никакого копирования, и это должно быть быстрее, так как есть только один создание списка.
Фактический объект списка будет храниться в стеке (как все локальные переменные и аргументы функции), в то время как элементы в списке будут находиться в куче. –
Почему вам все равно, где они хранятся? – Pubby
Pubby, данные стека будут удалены в конце функции. – danihp