Я работаю в средах, где стек может быть небольшим и нужно избегать фрагментации кучи, поэтому я бы использовал следующие правила:
Если список небольшой и известен фиксированный размер, стек.
Если список небольшой и имеет неизвестный фиксированный размер, вы можете рассмотреть как кучу, так и alloca (). Использование кучи было бы хорошим выбором, если бы вы могли гарантировать, что ваша функция ничего не выделяет в куче в течение времени, в течение которого ваше выделение будет происходить там. Если вы не можете гарантировать это, вы запрашиваете фрагмент, и alloca () будет лучшим выбором.
Если список большой или его нужно будет расширять, используйте кучу. Если вы не можете гарантировать, что он не будет фрагментирован, у нас есть некоторые ресурсы для этого, встроенные в наш менеджер памяти, такие как распределение сверху вниз и отдельные кучи.
В большинстве ситуаций людям не нужно беспокоиться о фрагментации, в этом случае они, вероятно, не рекомендуют использовать alloca.
Что касается класса, содержащего список, если он локальный по отношению к области действия функции, я бы поместил его в стек при условии, что внутренние структуры данных не очень велики.