Чтение различных типов данных в общей памяти
-
08-10-2019 - |
Вопрос
Я хочу поделиться некоторой памятью между различными процессами, выполняющими DLL. Поэтому я создаю отображаемый память-файл HANDLE hSharedFile = CreateFileMapping(...)
тогда LPBYTE hSharedView = MapViewOfFile(...)
а также LPBYTE aux = hSharedView
Теперь я хочу прочитать bool
, А. int
, А. float
и а char
из AUX Array. Чтение А. bool
а также char
это легко. Но как бы я пошел по чтению int
или float
? Обратите внимание, что то int
или float
Может начать в положении 9, например, положение, не имеющее отдохнуть на 4.
Я знаю, что вы можете прочитать char[4]
а потом memcpy
это в а float
или int
. Отказ Но мне действительно нужно, чтобы это было очень быстро. Мне интересно, можно ли что-то сделать с указателями?
заранее спасибо
Решение
Если вы знаете, например, что элементы массива AUX [13..16] содержат поплавок, то вы можете получить доступ к этому плаванию несколькими способами:
float f = *(float*)&aux[13] ; // Makes a copy. The simplest solution.
float* pf = (float*)&aux[13] ; // Here you have to use *pf to access the float.
float& rf = *(float*)&aux[13] ; // Doesn't make a copy, and is probably what you want.
// (Just use rf to access the float.)
Другие советы
Нет ничего плохого в захвате int
На смещении 9:
int* intptr = (int*) &data[9];
int mynumber = *intptr;
Там может быть действительно крошечный штраф производительности для этого «необъяснимого» доступа, но он все равно будет работать правильно, а шансы на вас, заметив какие-либо различия.
Прежде всего, я думаю, вы должны измерить. Есть три варианта, с которыми вы можете пойти с этим, я могу подумать:
- с неизменной памятью
- с участием
memcpy
в буферы - с памятью на заказ
Недоставленная память будет работать нормально, она будет просто медленнее, чем выровнено. Насколько медленнее это, и это имеет значение для вас? Мера, чтобы узнать.
Копирование в буфер отключится медленнее необъяснимое доступу для дополнительных операций копирования. Измерение скажет вам, если это того стоит.
При использовании Unarigned Memory слишком медленно для вас, и вы не хотите копировать данные вокруг (возможно из-за стоимости производительности), то вы можете сделать быстрее, потраченные впустую некоторое пространство памяти и увеличивая сложность программы. Не используйте сопоставленную память слепо: вокруг вашей «базы» указателя вверх к подходящему значению (например, 8 байт) и только делают чтение / пишет при 8-байтовых приращениях этого значения «базы». Это гарантирует, что все ваши доступа будут выровнены.
Но делайте мера, прежде чем идти во все эти проблемы.