Какую функциональность предоставляет ключевое слово stackalloc
? Когда и почему я хочу использовать его?
Когда мне нужно будет использовать ключевое слово stackalloc в С#?
Ответ 1
От MSDN:
Используется в контексте небезопасного кода для выделения блока памяти на стек.
Одной из основных особенностей С# является то, что вам обычно не требуется доступ к памяти напрямую, как это было бы в C/С++ с помощью malloc
или new
. Однако, если вы действительно хотите явно выделить некоторую память, вы можете, но С# считает это "небезопасным", поэтому вы можете делать это только при компиляции с настройкой unsafe
. stackalloc
позволяет выделить такую память.
Вам почти наверняка не нужно использовать его для написания управляемого кода. Возможно, что в некоторых случаях вы можете писать более быстрый код, если вы напрямую обращаетесь к памяти - это в основном позволяет использовать манипуляции с указателями, которые удовлетворяют некоторым проблемам. Если у вас нет конкретной проблемы, а небезопасный код - это единственное решение, вам это, вероятно, никогда не понадобится.
Ответ 2
Stackalloc будет выделять данные в стеке, которые могут использоваться, чтобы избежать мусора, который будет сгенерирован путем многократного создания и уничтожения массивов типов значений внутри метода.
public unsafe void DoSomeStuff()
{
byte* unmanaged = stackalloc byte[100];
byte[] managed = new byte[100];
//Do stuff with the arrays
//When this method exits, the unmanaged array gets immediately destroyed.
//The managed array no longer has any handles to it, so it will get
//cleaned up the next time the garbage collector runs.
//In the mean-time, it is still consuming memory and adding to the list of crap
//the garbage collector needs to keep track of. If you're doing XNA dev on the
//Xbox 360, this can be especially bad.
}
Ответ 3
Павел
Как говорили все, это ключевое слово направляет среду выполнения для размещения в стеке, а не в кучу. Если вас интересует именно это, посмотрите эту статью.
Ответ 4
http://msdn.microsoft.com/en-us/library/cx9s2sy4.aspx
это ключевое слово используется для работы с небезопасными манипуляциями с памятью. Используя его, вы можете использовать указатель (мощная и болезненная функция в C/С++)
Ответ 5
stackalloc
направляет среду .net для выделения памяти в стеке.
Ответ 6
Похоже, что Стив указал, что используется только в небезопасном контексте кода (например, когда вы хотите использовать указатели).
Если вы не используете небезопасный код в своем приложении С#, вам это никогда не понадобится.
Ответ 7
Большинство других ответов сосредоточено на "какой функциональности" части вопроса OP.
Я верю, что это ответит, когда и почему:
Когда вам это нужно?
Наилучшая наихудшая производительность с локальностью кэша нескольких небольших массивов.
Теперь в среднем приложении вам это не понадобится, но для сценариев, чувствительных к реальному времени, он дает более детерминированную производительность: никакой GC не задействован, и вам почти гарантирован доступ к кешу.
(Потому что наихудшая производительность важнее средней производительности.)
Имейте в виду, что размер стека по умолчанию в .net невелик, хотя!
(Я думаю, что 1 МБ для обычных приложений и 256 КБ для ASP.net?)
Практическое использование может включать, например, обработку звука в реальном времени.