Я ищу окончательный ответ (если он действительно существует) о том, сколько памяти должно быть выделено при создании статических блоков общей памяти с помощью boost :: interprocess
managed_shared_memory
. Даже официальные примеры , кажется, выделяют произвольно большие блоки памяти.
Рассмотрим следующую структуру:
// Example: simple struct with two 4-byte fields
struct Point2D {
int x, y;
};
Моя первоначальная реакция такова, что необходимый размер будет 8 байтов или sizeof (Point2D)
. Это ужасно терпит неудачу, когда я пытаюсь построить объект, что приводит к сбою сегментов во время выполнения.
// BAD: 8 bytes is nowhere near enough memory allocated.
managed_shared_memory segment(create_only, "My shared memory", sizeof(Point2D));
Какая операция чтения / записи вызывает сбои сегментов? Стековые операции? Временно выделить в segment.construct ()
? Сколько накладных расходов необходимо при выделении разделяемой памяти?
Методом проб и ошибок я обнаружил, что умножение размера на 4 может работать для приведенной выше структуры, но разваливается, когда я начинаю добавлять дополнительные поля в свою struct
. Так что это пахнет плохим взломом.
Кто-то может возразить, что «память дешевая» на современном ПК, но я не согласен с этой философией и не люблю выделять больше, чем мне нужно, если я могу этого избежать. Вчера я покопался в документации по Boost и не нашел никаких рекомендаций. Давайте узнаем что-то новое сегодня!