Я ищу окончательный ответ (если он действительно существует) на то, сколько памяти должно быть выделено при создании статических кусков разделяемой памяти через 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 и не мог найти никаких рекомендаций.Сегодня вы узнаете что-то новое!