Ищу грязый хак: byte* -> byte[] -> byte* без копирования
От: Albeoris  
Дата: 29.12.13 15:05
Оценка:
Доброго времени суток!
У меня есть указатель на массив байт. .NET'ие методы умеют работать с управляемым массивом байт. Я не хочу копировать данные из неуправляемой памяти в управляемую, так как unsafe-методы были выбраны специально ввиду того, что я могу в любой момент вручную освободить память (работаю с изображениями) не дожидаясь, пока это сделает сборщик мусора. Выделяя память в упаравляемых массивах я получаю OutOfMemoryException, даже есть насильно запускаю после обработки каждого изображения сборку мусора.

Как многим, наверное, известно, единственное чем отличается управляемый массив от неуправляемого — 8 байт впереди него, 4 — указатель на тип и ещё 4 — длина массива. Я моуг выделить дополнительно 8 байт, начать запись с 8го, а затем заполнить их (или вначале заполнить — не важно).

Но я всё равно не могу из получившейся конструкции получить управляемый массив:
byte[] array = (byte[])(object)ptr;
byte[] array = (byte[])(dynamic)ptr;
Гнусно матерятся.

Подскажите — возможно, есть какой-нибудь способ решить эту проблему?
Принимаются три варианта решения:
1) Превратить byte* в byte[] без копирования.
2) Немедленно освободить byte[] размером >150мб
3) Скормить методу, который принимает byte[] вместо него byte* (фактически возвращаемся к п.1.)

Заранее благодарен за любую помощь.

P.S. Ещё раз: никаких new byte[150 * 1024 * 1024]
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.