2012-05-15 1 views
-1

У меня есть эта реализация в C#:как смещение ячейки памяти, указанный объект в C++

, если я не ошибаюсь, он используется для: компенсируя ячейку памяти, указанную allocatedObject по размеру числа байтов и преобразование указателя памяти к Int64

short size = getSize(); 

IntPtr allocatedObject; 

long posInMemory = allocatedObject.Offset(size).ToInt64(); 

Как я могу добиться этого в C++: положение в памяти IntPtr (void *allocatedObject;) и преобразовать указатель памяти к Int64.

Заранее благодарен!

+0

Это похоже супер опасно. Что вы делаете, что может понадобиться? –

+1

Существует очень мало причин, чтобы захватить вещи из случайных областей памяти в C++, не делайте этого, если не программируете микроконтроллеры. –

+4

Кажется, что у нас есть ОП, который не знает, что он делает, и он спрашивает «могу ли я быть» для перевода C# на C++ для него, но без отображения полного кода и распространения вопроса на 3 ошибочные проблемы X/Y. Sweet – sehe

ответ

2

Предполагая, что у вас есть int64_t типа, который представляет собой 64бит целое, вы бы сначала привести указатель на указатель на char (что по определению имеет sizeof = 1), то смещение его размером, а затем бросил его снова к указателю int64_t.

static_cast< int64_t* >(static_cast< char* >(allocatedObject) + size) 

Это потому, что вы не можете сделать указатель арифметику с void указателем, так как он не имеет размера. В качестве альтернативы вы можете указать reinterpret_cast указатель на std::intptr_t (целое число, достаточно большое, чтобы содержать любой указатель), увеличить его по размеру и затем наложить на указатель на int64_t.

+1

Почему не просто '(int64_t *) (выделеноОбъект + размер)'? – Abyx

+0

@Abyx: Потому что C-style casts - это отбросы земли? – Puppy

+1

@DeadMG, поэтому вы предпочитаете использовать 'manyletters_cast', когда вы вводите целое число в указатель? – Abyx

Смежные вопросы