Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

README.md

stackalloc


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

Это ключевое слово допустимо только в инициализаторах локальных переменных:

int* block = stackalloc int[100];

Начиная с версии C# 7.3 (C# 7.3) для массивов stackalloc можно использовать синтаксис инициализатора массива:

int* first = stackalloc int[3] { 1, 2, 3 };
int* second = stackalloc int[] { 1, 2, 3 };
int* third = stackalloc[] { 1, 2, 3 };

// битовая маска задаёт 1 бит в каждом элементе
int* mask = stackalloc[] {
    0b_0000_0000_0000_0001,
    0b_0000_0000_0000_0010,
    0b_0000_0000_0000_0100,
    0b_0000_0000_0000_1000,
    0b_0000_0000_0001_0000,
    0b_0000_0000_0010_0000,
    0b_0000_0000_0100_0000,
    0b_0000_0000_1000_0000,
    0b_0000_0001_0000_0000,
    0b_0000_0010_0000_0000,
    0b_0000_0100_0000_0000,
    0b_0000_1000_0000_0000,
    0b_0001_0000_0000_0000,
    0b_0010_0000_0000_0000,
    0b_0100_0000_0000_0000,
    0b_1000_0000_0000_0000
};
// 1
// 2
// 4
// 8
...
// 4096
// 8192
// 16384
// 32768

Так как задаются типы указателей (Типы указателей), stackalloc требует небезопасного контекста. Небезопасный код менее безопасен, чем безопасные аналоги. При использовании stackalloc в среде CLR автоматически включается обнаружение переполнения буфера.


Пример: вычисляются первые 20 чисел последовательности Фибоначчи

В этом коде блок памяти, размер которого позволяет сохранить 20 элементов типа int, выделяется не куче (динамическая память), а стеку.

Адрес блока хранится в указателе fib.

Эта память не подвергается сборке мусора и её не нужно закреплять с помощью атрибута fixed. Время существования блока памяти ограничивается временем существования метода, который его определяет.

screen capture 1