Чтение разных типов данных в общей памяти - PullRequest
1 голос
/ 09 января 2011

Я хочу разделить часть памяти между различными процессами, выполняющими DLL. Поэтому я создаю отображенный в память файл с помощью HANDLE hSharedFile = CreateFileMapping(...), затем LPBYTE hSharedView = MapViewOfFile(...) и LPBYTE aux = hSharedView

Теперь я хочу прочитать bool, int, float и char из массива aux. Читать bool и char легко. Но как бы я прочитал int или float? Обратите внимание, что int или float может начинаться с позиции 9, например. позиция, которая не делится на 4.

Я знаю, что вы можете прочитать char[4] и затем memcpy в float или int. Но мне действительно нужно, чтобы это было очень быстро. Мне интересно, можно ли что-то сделать с указателями?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 09 января 2011

Если вы, например, знаете, что элементы массива 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.)
2 голосов
/ 09 января 2011

Нет ничего плохого в том, чтобы захватить int со смещением 9:

int* intptr = (int*) &data[9];

int mynumber = *intptr;

Может быть очень маленькое снижение производительности для этого "невыровненного" доступа, но он все равно будет работать правильнои вероятность того, что вы заметите какие-либо различия, невелика.

1 голос
/ 09 января 2011

Прежде всего, я думаю, что вы должны измерить.Есть три варианта, о которых я могу подумать:

  • с невыровненной памятью
  • с memcpy в буферы
  • с настраиваемой памятью

Нераспределенная память будет работать нормально, она будет работать медленнее, чем выровненная.Насколько это медленнее, и имеет ли это значение для вас?Мера, чтобы узнать.

Копирование в буфер компенсирует более медленный не выровненный доступ для дополнительных операций копирования.Измерение покажет вам, стоит ли оно того.

Если использование невыровненной памяти слишком медленное для вас и вы не хотите копировать данные (возможно, из-за снижения производительности), то вы можете сделать это быстрее,тратить пространство памяти и увеличивать сложность вашей программы.Не используйте отображенную память вслепую: округлите свой «базовый» указатель вверх до подходящего значения (например, 8 байт) и выполняйте только чтение / запись с 8-байтовыми приращениями этого «базового» значения.Это обеспечит выравнивание всех ваших обращений.

Но прежде чем приступить ко всем этим неприятностям, сделайте все возможное.

...