Кто-нибудь когда-либо использовал stackalloc
во время программирования на C #? Я знаю о том, что делает, но единственный раз, когда он появляется в моем коде, случайно, потому что Intellisense предлагает это, когда я static
, например, начинаю печатать .
Хотя это не связано со сценариями использования stackalloc
, я на самом деле выполняю значительное количество устаревших взаимодействий в своих приложениях, поэтому время от времени я мог прибегнуть к использованию unsafe
кода. Но тем не менее я обычно нахожу способы unsafe
полностью избежать .
А поскольку размер стека для одного потока в .Net составляет ~ 1 МБ (поправьте меня, если я ошибаюсь), я еще более зарезервирован для использования stackalloc
.
Существуют ли практические случаи, когда можно было бы сказать: «это именно тот объем данных и обработки, которые мне небезопасны и используются stackalloc
»?
источник
System.Numbers
использует его много источниковsource.microsoft.comОтветы:
Единственная причина для использования
stackalloc
- производительность (для вычислений или взаимодействия). Используяstackalloc
вместо выделенного массива кучи, вы создаете меньшее давление GC (GC должен работать меньше), вам не нужно закреплять массивы вниз, он быстрее выделяется, чем массив кучи, и он автоматически освобождается в методе. выход (выделенные в куче массивы освобождаются только при запуске GC). Кроме того, используяstackalloc
вместо собственного распределителя (например, malloc или .Net-эквивалент), вы также получаете скорость и автоматическое освобождение при выходе из области.С точки зрения производительности, если вы используете его,
stackalloc
вы значительно увеличите вероятность попадания кэша в процессор из-за локальности данных.источник
Я использовал stackalloc для выделения буферов для работы DSP в реальном времени. Это был очень специфический случай, когда производительность должна была быть максимально последовательной. Обратите внимание, что есть разница между согласованностью и общей пропускной способностью - в этом случае я не был обеспокоен слишком медленным распределением кучи, просто недетерминированностью сборки мусора в этой точке программы. Я бы не использовал его в 99% случаев.
источник
stackalloc
относится только к небезопасному коду. Для управляемого кода вы не можете решить, где разместить данные. Типы значений распределяются в стеке по умолчанию (если только они не являются частью ссылочного типа, в этом случае они размещаются в куче). Ссылочные типы размещаются в куче.Размер стека по умолчанию для простого ванильного приложения .NET составляет 1 МБ, но вы можете изменить это в PE-заголовке. Если вы запускаете потоки явно, вы также можете установить другой размер через перегрузку конструктора. Для приложений ASP.NET размер стека по умолчанию составляет всего 256 КБ, что следует учитывать при переключении между двумя средами.
источник
Stackalloc инициализация пролетов. В предыдущих версиях C # результат stackalloc мог быть сохранен только в локальной переменной указателя. Начиная с C # 7.2, stackalloc теперь может использоваться как часть выражения и может предназначаться для диапазона, и это может быть сделано без использования ключевого слова unsafe. Таким образом, вместо записи
Вы можете написать просто:
Это также чрезвычайно полезно в ситуациях, когда вам нужно некоторое пространство для выполнения операции, но вы хотите избежать выделения памяти кучи для относительно небольших размеров.
Источник: C # - All About Span: Изучение нового .NET Mainstay
источник
Span
увы, нет в .NET Framework 4.7.2 и даже не в 4.8 ... Так что новая языковая функция все еще имеет ограниченное применение в настоящее время.На этот вопрос есть несколько отличных ответов, но я просто хочу отметить, что
Stackalloc также можно использовать для вызова собственных API
Многие нативные функции требуют, чтобы вызывающая сторона выделяла буфер для получения возвращаемого результата. Например, функция CfGetPlaceholderInfo в
cfapi.h
имеет следующую подпись.Чтобы вызвать его в C # через взаимодействие,
Вы можете использовать stackalloc.
источник