Вопрос

Я хочу поделиться некоторой памятью между различными процессами, выполняющими 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-байтовых приращениях этого значения «базы». Это гарантирует, что все ваши доступа будут выровнены.

Но делайте мера, прежде чем идти во все эти проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top