Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Небезопасный доступ к массивам и массивы фиксированного размера




Небезопасный доступ к массиву — очень мощный инструмент, так как позволяет получать доступ к элементам:

1. управляемого объекта-массива, расположенного в куче (как показано в предыдущем разделе);

2. массива, расположенного в неуправляемой куче. Пример SecureString из главы 11 демонстрирует использование небезопасного доступа к массиву, возвращенному методом SecureStringToCoTaskMemUnicode класса SystemRuntitnelnterop-ServicesMarshal;

3. массива, расположенного в стеке потока.

Когда вопрос производительности стоит особенно остро, можно размещать управляемый объект-массив не в куче, а в стеке потока, используя оператор stack-alloc языка С# (он действует так же, как функция alloca языка С). Оператор stackalloc можно использовать для создания одномерного массива элементов значимого типа с нулевой нижней границей, причем значимый тип не должен содержать никаких полей ссылочного типа. По сути можно считать это выделением блока памяти, которым можно управлять, используя небезопасные указатели, и, поэтому, нельзя передавать адрес этого буфера памяти подавляющему большинству FCL-методов. Конечно, выделенная в стеке память (массив) будет автоматически освобождена после того, как метод возвратит управление; именно за счет этого достигается выигрыш в производительности. И, конечно же, надо не забыть задать параметр / unsafe для компилятора С#.

Метод StackallocDemo демонстрирует, как надо использовать оператор stackalloc языка С#:

using System;

public static class Program

{

public static void Main()

{

StackallocDemo();

InlineArrayDemo();

}

private static void StackallocDemo()

{

unsafe

{

const Int32 width = 20;

Char* pc = stackalloc Char[width]; // Выделяем в стеке память для массива.

String s = "Jeffrey Richter"; // 15 символов.

for (Int32 index = 0; index < width; index++)

{

pc[width - index - 1] = (index < s.Length) ? s[index] : '.';

}

// Следующий оператор выводит на экран " rethciR yerffeJ".

Console.WriteLine(new String(pc, 0, width));

}

}

 

private static void InlineArrayDemo()

{

unsafe

{

CharArray ca; // Выделяем в стеке память для массива.

Int32 widthlnBytes = sizeof(CharArray); Int32 width = widthlnBytes / 2;

String s = "Jeffrey Richter"; // 15 символов.

for (Int32 index = 0; index < width; index++)

{

ca.Characters[width - index - 1] = (index < s.Length) ? s[index] : '.';

}

// Следующий оператор выводит на экран " rethciR yerffeJ".

Console.WriteLine(new String(ca.Characters, 0, width));

}

}

}

 

internal unsafe struct CharArray

{

// Этот массив встраивается в структуру,

public fixed Char Characters[20];

}

Массивы являются ссылочными типами, поэтому обычно определенное в структуре поле массива фактически является указателем или ссылкой на массив, а сам массив располагается в памяти структуры. Однако можно встроить массив прямо в структуру, как в структуре CharArray в приведенном выше коде. Есть ряд требований к вложению массива внутрь структуры:

1. тип должен быть структурой (то есть значимым), нельзя встраивать массив в класс (ссылочный тип);

2. поле или структура, в которой оно определено, должно быть отмечено ключевым словом unsafe;

3. поле массива должно быть отмечено ключевым словом fixed;

4. массив должен быть одномерным и с нулевой нижней границей;

5. разрешены элементы массива только следующих типов: Boolean, Char, SByte, Byte, Int32, UInt32, Int64, UInt64, Single или Double.

Встроенные массивы обычно применяются, когда используется небезопасный код, в котором неуправляемая структура данных также содержит встроенный массив. Но ничто не запрещает использовать их в других случаях. Метод Inline-ArrayDemo в приведенном выше коде иллюстрирует использование встроенных массивов. Он делает то же, что метод StackallocDemo, но другими методами.



Поделиться:

Дата добавления: 2015-04-21; просмотров: 107; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты