Если ваша структура C # использует только примитивные типы данных и имеет ту же структуру, что и ваша собственная структура в C ++, вы можете обойти эти ограничения с помощью ручного управления памятью и небезопасного кода. В качестве бонуса вы улучшите производительность, избегая сортировки.
Выделите память:
IntPtr arr = Marshal.AllocHGlobal (sizeof (MyStruct) * 256);
Это в основном malloc
, поэтому выделенная память находится за пределами понимания GC.
Вы можете передать IntPtr нативному коду, как если бы он был MyStruct[256]
, и будет маршалироваться только IntPtr, а не память, на которую он указывает. Нативный и управляемый код могут напрямую обращаться к одной и той же памяти.
Для чтения / записи структур в массиве с C # используйте указатели C #:
static unsafe MyStruct GetMyStructAtIndex (IntPtr arr, int index)
{
MyStruct *ptr = ((MyStruct *)arr) + index;
return *ptr;
}
static unsafe void SetMyStructAtIndex (IntPtr arr, int index, MyStruct value)
{
MyStruct *ptr = ((MyStruct *)arr) + index;
*ptr = value;
}
Не забудьте
Marshal.FreeHGlobal (arr);
когда вы закончите с памятью, free
это.