Когда массив выделяется на стеке в c#?
Я пытался выяснить, когда вещи распределяются по стеку, и я не могу понять, как бы вы сделали так, чтобы массив (или, скорее, значения в нем) были распределены по стеку;
В этом примере:
public void foo()
{
int bar[] = new int [10];
}
10 int структур будут размещены в куче, только указатель на них будет находиться в стеке, правильно?
Как сделать массив фиксированного размера, чтобы перейти в стек? Что, если я использую штукатурки, которые я определил?
Что делать, если я хочу, чтобы размер массива передавался в качестве параметра функция?
Насколько я понимаю, не должно быть проблем с получением массива произвольного размера в стеке при вызове функции, если размер известен при вызове функции.
Должен ли я вообще беспокоиться об этом? Насколько я понимаю, получение этого массива фиксированного размера в стеке улучшит производительность, потому что выделение кучи не выполняется.
1 ответ:
10 int структур были бы размещены на куче, только указатель на них был бы на стеке, правильно?
Да, верно.
Как сделать массив фиксированного размера, чтобы перейти в стек? Что, если я использую штукатурки, которые я определил?
stackalloc
ключевое слово служит этой цели. Однако это работает только в небезопасном контексте, который является довольно неоправданно ограничивающим фактором в большинстве сценариев, не стоит производительности компромисс.Пример:
public void unsafe foo() { int* bar = stackalloc int [10]; }
Вам придется использовать арифметику указателей для доступа к элементам массива.
Что делать, если я хочу, чтобы размер массива передавался в качестве параметра функции? Насколько я понимаю, не должно быть никаких проблем с получением массива произвольного размера в стеке при вызове функции, если размер известен при вызове функции.
Работает, как и ожидалось:
public void unsafe foo(int length) { int* bar = stackalloc int [length]; }
Должен ли я вообще беспокоиться об этом? Насколько я понимаю получение этот массив фиксированного размера в стеке повысит производительность, поскольку выделение кучи не выполняется.
Нет, в общем-то нет. Если только вы не имеете дело с некоторыми очень специфическими сценариями, критичными для производительности, такими как тяжелые математические вычисления, шифрование, сжатие и т. д., это не приносит никакой реальной пользы.
Также смотрите этот вопрос для обсуждения, связанного с производительностью.