Ответ 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];
}
Должен ли я быть этому обеспокоен? Насколько я понимаю, получение этого массива фиксированного размера в стеке улучшило бы производительность, потому что не было выделено кучи.
Нет, вообще нет. Если вы не справляетесь с некоторыми очень специфическими критическими для производительности сценариями, такими как тяжелые математические вычисления, шифрование, сжатие и т.д., Это не приносит реальной выгоды.
Также см. этот вопрос для обсуждения, связанного с производительностью.