Рассмотрим следующую структуру:
internal struct WriteBuffer64
{
private const int INLINE_BUFFER_SIZE = 64;
private unsafe fixed byte buffer[INLINE_BUFFER_SIZE];
private int used;
public unsafe Span GetWriteSpan(int toWrite)
{
if (used + toWrite > INLINE_BUFFER_SIZE)
throw new Exception();
int offset = used;
used += toWrite;
return MemoryMarshal.CreateSpan(ref buffer[offset], toWrite);
}
public unsafe ReadOnlySpan AsSpan()
{
return MemoryMarshal.CreateSpan(ref buffer[0], used);
}
}
Мне интересно, безопасно ли это делать. Экземпляры WriteBuffer могут располагаться в куче при упаковке или использовании в типах классов. Итак, я предполагаю, что собственный указатель byte* (указывающий на фиксированный буфер) может быть небезопасным для использования.
А как насчет Span? Способен ли он интерпретировать это как ссылку на управляемый объект? В более общем плане, как работает магия со ссылками на управляемые объекты в Spans?
ОБНОВЛЕНИЕ
Чтобы быть более конкретным:
БЕЗОПАСНЫЙ КОРПУС
byte[] utf8 = Encoding.UTF8.GetBytes("Hello World!");
WriteBuffer64 buffer = new WriteBuffer64();
BinaryPrimitives.WriteInt32BigEndian(buffer.GetWriteSpan(sizeof(int)), utf8.Length);
utf8.AsSpan().CopyTo(buffer.GetWriteSpan(utf8.Length));
using Stream file = File.OpenWrite("output.bin");
file.Write(buffer.AsSpan());
ТОЖЕ БЕЗОПАСНО?
public class Encoder
{
private WriteBuffer64 buffer = new WriteBuffer64();
public void Encode()
{
byte[] utf8 = Encoding.UTF8.GetBytes("Hello World!");
BinaryPrimitives.WriteInt32BigEndian(buffer.GetWriteSpan(sizeof(int)), utf8.Length);
utf8.AsSpan().CopyTo(buffer.GetWriteSpan(utf8.Length));
}
public void WriteToFile()
{
using Stream file = File.OpenWrite("output.bin");
file.Write(buffer.AsSpan());
}
}
var encoder = new Encoder();
encoder.Encode();
encoder.WriteToFile();
Подробнее здесь: https://stackoverflow.com/questions/792 ... truct-to-u
Безопасно ли использовать ссылку на встроенный буфер фиксированного размера структуры для использования в Span в C#? ⇐ C#
Место общения программистов C#
1732970136
Anonymous
Рассмотрим следующую структуру:
internal struct WriteBuffer64
{
private const int INLINE_BUFFER_SIZE = 64;
private unsafe fixed byte buffer[INLINE_BUFFER_SIZE];
private int used;
public unsafe Span GetWriteSpan(int toWrite)
{
if (used + toWrite > INLINE_BUFFER_SIZE)
throw new Exception();
int offset = used;
used += toWrite;
return MemoryMarshal.CreateSpan(ref buffer[offset], toWrite);
}
public unsafe ReadOnlySpan AsSpan()
{
return MemoryMarshal.CreateSpan(ref buffer[0], used);
}
}
Мне интересно, безопасно ли это делать. Экземпляры WriteBuffer могут располагаться в куче при упаковке или использовании в типах классов. Итак, я предполагаю, что собственный указатель byte* (указывающий на фиксированный буфер) может быть небезопасным для использования.
А как насчет Span? Способен ли он интерпретировать это как ссылку на управляемый объект? В более общем плане, как работает магия со ссылками на управляемые объекты в Spans?
ОБНОВЛЕНИЕ
Чтобы быть более конкретным:
БЕЗОПАСНЫЙ КОРПУС
byte[] utf8 = Encoding.UTF8.GetBytes("Hello World!");
WriteBuffer64 buffer = new WriteBuffer64();
BinaryPrimitives.WriteInt32BigEndian(buffer.GetWriteSpan(sizeof(int)), utf8.Length);
utf8.AsSpan().CopyTo(buffer.GetWriteSpan(utf8.Length));
using Stream file = File.OpenWrite("output.bin");
file.Write(buffer.AsSpan());
ТОЖЕ БЕЗОПАСНО?
public class Encoder
{
private WriteBuffer64 buffer = new WriteBuffer64();
public void Encode()
{
byte[] utf8 = Encoding.UTF8.GetBytes("Hello World!");
BinaryPrimitives.WriteInt32BigEndian(buffer.GetWriteSpan(sizeof(int)), utf8.Length);
utf8.AsSpan().CopyTo(buffer.GetWriteSpan(utf8.Length));
}
public void WriteToFile()
{
using Stream file = File.OpenWrite("output.bin");
file.Write(buffer.AsSpan());
}
}
var encoder = new Encoder();
encoder.Encode();
encoder.WriteToFile();
Подробнее здесь: [url]https://stackoverflow.com/questions/79236969/is-it-safe-to-take-the-reference-of-an-inline-fixed-size-buffer-of-a-struct-to-u[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия