Подтвердить что ты не робот

Когда мне нужно будет использовать ключевое слово stackalloc в С#?

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

4b9b3361

Ответ 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?)

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