Когда массив выделяется на стеке в c#?


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

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

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

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

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

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

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

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

1 14

1 ответ:

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

Да, верно.

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

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

Пример:

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

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

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

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

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

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

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

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