гдеробозначает указатель, получающий адрес области памяти, достаточной для хранения объектов, имеющих указанныйтип,в количестве, которое обозначаетразмер.Если же в стеке недостаточно места для распределения памяти, то генерируется исключениеSystem. StackOverflowException.И наконец, операторstackallocможно использовать только в небезопасном коде.

Как правило, память для объектов выделяется из кучи — динамически распределяемой свободной области памяти. А выделение памяти из стека является исключением. Ведь переменные, располагаемые в стеке, не удаляются средствами "сборки мусора", а существуют только в течение времени выполнения метода, в котором они объявляются. После возврата из метода выделенная память освобождается. Преимущество применения оператораstackallocзаключается, в частности, в том, что в этом случае не нужно беспокоиться об очистке памяти средствами "сборки мусора".

Ниже приведен пример применения оператораstackalloc*

// Продемонстрировать применение оператора stackalloc.

using System;

class UseStackAlloc {

unsafe static void Main() {

int* ptrs = stackalloc int[3];

ptrs[0] = 1; ptrs[1] = 2; ptrs[2] = 3;

for(int i=0; i < 3; i++)

Console.WriteLine(ptrs[i]);

}

}

Вот к какому результату приводит выполнение кода из данного примера.

1

2

3

Создание буферов фиксированного размера

Ключевое словоfixedнаходит еще одно применение при создании одномерных массивов фиксированного размера. В документации на C# такие массивы называютсябуферами фиксированного размера.Такие буферы всегда являются членами структуры. Они предназначены для создания структуры, в которой содержатся элементы массива, образующйе буфер. Когда элемент массива включается в состав структуры, в ней, как правило, хранится лишь ссылка на этот массив. Используя буфер фиксированного размера, в структуре можно разместить весь массив. В итоге получается структура, пригодная в тех случаях, когда'важен ее размер, как, например, в многоязыковом программировании, при согласовании данных, созданных вне программы на С#, или же когда требуется неуправляемая структура, содержащая массив. Но буферы фиксированного размера можно использовать только в небезопасном коде.

Для создания буфера фиксированного размера служит следующая общая форма:

fixedтип имя_буфера[размер];

гдетипобозначает тип данных массива;имя_буфера— конкретное имя буфера фиксированного размера;размер— количество элементов, образующих буфер. Буферы фиксированного размера могут указываться только в структуре.

Перейти на страницу:

Похожие книги