В C # мне нужно записать T [] в поток, в идеале без каких-либо дополнительных буферов. У меня есть динамический код, который преобразует T [] (где T - структура без объектов) в void * и исправляет его в памяти, и это прекрасно работает. Когда поток представлял собой файл, я мог использовать собственный Windows API для прямой передачи void *, но теперь мне нужно записать в общий объект Stream, который принимает байт [].
Вопрос: Может кто-нибудь предложить взломать способ создания фиктивного объекта массива, который фактически не имеет каких-либо распределений кучи, а скорее указывает на уже существующее (и фиксированное) расположение кучи?
Это тот псевдокод, который мне нужен:
void Write(Stream stream, T[] buffer)
{
fixed( void* ptr = &buffer ) // done with dynamic code generation
{
int typeSize = sizeof(T); // done as well
byte[] dummy = (byte[]) ptr; // <-- how do I create this fake array?
stream.Write( dummy, 0, buffer.Length*typeSize );
}
}
Обновление:
Я описал, как сделать fixed(void* ptr=&buffer)
в этой статье . Я всегда мог создать байт [], исправить его в памяти и выполнить небезопасное байт-копирование из одного указателя в другой, а затем отправить этот массив в поток, но я надеялся избежать ненужного дополнительного выделения и копирования.
Невозможно
Если подумать, в байте [] есть куча метаданных с размерами массива и типом элемента. Простая передача ссылки (указателя) на T [] как byte [] может не сработать, потому что метаданные блока все равно будут метаданными T []. И даже если структура метаданных идентична, длина T [] будет намного меньше байта [], поэтому любой последующий доступ к байту [] с помощью управляемого кода приведет к неверным результатам.
Запрошенная функция @ Microsoft Connect
Пожалуйста, проголосуйте за этот запрос , надеюсь MS послушает.