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