Почему бы не получить лучший из обоих миров: сделайте контейнер интеллектуальных указателей (такой как boost::shared_ptr
или std::shared_ptr
). Вы не должны управлять памятью, и Вы не должны иметь дело с большими операциями копии.
Я предлагаю вам использовать ToInt64 () и long для выполнения ваших вычислений. Таким образом вы избежите проблем с 64-битной версией .NET framework.
IntPtr ptr = new IntPtr(oldptr.ToInt64() + 2);
Это добавляет немного накладных расходов на 32-битную систему, но это безопаснее.
Для арифметики указателей в C # вы должны использовать правильные указатели внутри unsafe
context:
class PointerArithmetic
{
unsafe static void Main()
{
int* memory = stackalloc int[30];
long* difference;
int* p1 = &memory[4];
int* p2 = &memory[10];
difference = (long*)(p2 - p1);
System.Console.WriteLine("The difference is: {0}", (long)difference);
}
}
Тип IntPtr
предназначен для передачи дескрипторов или указателей, а также для маршалинга на языки, поддерживающие указатели. Но это не для арифметики указателей.
Я обнаружил, что могу избежать операций с указателями, используя Marshal.ReadByte (), Marshal. ReadInt16 () и др. Методы. Эта группа методов позволяет указать смещение при выпуске в IntPtr ...
ReadInt16 () и др. Методы. Эта группа методов позволяет указать смещение при выпуске в IntPtr ... ReadInt16 () и др. Методы. Эта группа методов позволяет указать смещение при выпуске в IntPtr ...Вы можете использовать метод расширения:
public static IntPtrExtensions {
public static IntPtr Add( this IntPtr ptr, int offSet ) {
IntPtr ret = new IntPtr( ptr.ToInt64() + offSet );
return ret;
}
}
// ... somewhere else ...
IntPtr pointer = GetHandle().Add( 15 );