Когда массив распределяется по стеку в С#?

Я пытался выяснить, когда вещи распределяются по стеку, и я не могу понять, как бы вы сделали массив (или, скорее, значения в нем) распределены в стеке;

в этом примере:

public void foo()
{
    int bar[] = new int [10];
}

10 кусков int structs будут выделены в куче, только указатель на них будет в стеке, правильно?

Как сделать фиксированный размерный массив включенным в стек? Что делать, если я использую stucts, которые я определил?

Что делать, если я хочу, чтобы размер массива передавался как параметр в функцию?

Насколько я понимаю, не должно возникнуть проблемы с получением массива произвольного размера в стеке при вызове функции, если размер известен при вызове функции.

Должен ли я быть этому обеспокоен? Насколько я понимаю, получение этого массива фиксированного размера в стеке улучшило бы производительность, потому что не было выделено кучи.

Ответ 1

10 кусков int structs будут выделены в куче, только указатель на них будет в стеке, правильно?

Да, правильно.

Как сделать фиксированный размерный массив включенным в стек? Что делать, если я использую stucts, которые я определил?

stackalloc keyword служит для этой цели. Однако это работает только в небезопасном контексте, что является довольно излишне ограничивающим фактором в большинстве сценариев, не стоит компромисс производительности.

Пример:

public void unsafe foo()
{
    int* bar = stackalloc int [10];
}

Вам нужно будет использовать арифметику указателей для доступа к элементам массива.

Что делать, если я хочу, чтобы размер массива передавался как параметр в функцию? Насколько я понимаю, не должно быть никаких проблем, чтобы получить массив произвольного размера в стеке при вызове функции, если размер известен при вызове функции.

Работает как ожидалось:

public void unsafe foo(int length)
{
    int* bar = stackalloc int [length];
}

Должен ли я быть этому обеспокоен? Насколько я понимаю, получение этого массива фиксированного размера в стеке улучшило бы производительность, потому что не было выделено кучи.

Нет, вообще нет. Если вы не справляетесь с некоторыми очень специфическими критическими для производительности сценариями, такими как тяжелые математические вычисления, шифрование, сжатие и т.д., Это не приносит реальной выгоды.

Также см. этот вопрос для обсуждения, связанного с производительностью.