Когда мне нужно будет использовать ключевое слово stackalloc в C #? - PullRequest
24 голосов
/ 06 апреля 2009

Какие функции предоставляет ключевое слово stackalloc? Когда и почему я хотел бы использовать это?

Ответы [ 7 ]

18 голосов
/ 06 апреля 2009

С MSDN :

Используется в небезопасном контексте кода для выделения блока памяти на стек.

Одной из основных особенностей C # является то, что вам обычно не требуется прямой доступ к памяти, как это было бы в C / C ++ с использованием malloc или new. Однако, если вы действительно хотите явно выделить некоторую память, вы можете, но C # считает это «небезопасным», поэтому вы можете сделать это только в том случае, если вы компилируете с параметром unsafe. stackalloc позволяет выделить такую ​​память.

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

15 голосов
/ 29 мая 2010

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.
}
9 голосов
/ 06 апреля 2009

Пол

Как все здесь сказали, это ключевое слово направляет среду выполнения для размещения в стеке, а не в куче. Если вам интересно, что именно это означает, ознакомьтесь с этой статьей .

3 голосов
/ 06 апреля 2009

http://msdn.microsoft.com/en-us/library/cx9s2sy4.aspx

это ключевое слово используется для работы с небезопасными манипуляциями с памятью. Используя его, вы можете использовать указатель (мощная и болезненная функция в C / C ++)

2 голосов
/ 06 апреля 2009

stackalloc указывает среде выполнения .net выделять память в стеке.

0 голосов
/ 03 апреля 2016

Большинство других ответов сосредоточены на вопросе «что такое функциональность» в вопросе ОП.
Я верю, что это ответит на вопрос, когда и почему:

Когда вам это нужно?
Для лучшей производительности в худшем случае с локальностью кэша нескольких маленьких массивов.

Теперь в среднем приложении это вам не понадобится, но для сценариев, чувствительных к реальному времени, оно дает более детерминированную производительность: GC не задействован, и вам гарантированно попадание в кэш.
(Потому что производительность в худшем случае важнее, чем средняя.)

Имейте в виду, что размер стека по умолчанию в .net маленький!
(Я думаю, что это 1 МБ для обычных приложений и 256 КБ для ASP.net?)

Практическое использование может, например, включать обработку звука в реальном времени.

0 голосов
/ 06 апреля 2009

Это, как указал Стив, используется только в небезопасном контексте кода (например, когда вы хотите использовать указатели).

Если вы не используете небезопасный код в своем приложении C #, то вам никогда это не понадобится.

...