Безопасно ли использовать boost :: опционально в межпроцессной памяти?

Пожалуйста, рассмотрите следующую структуру:

struct ThingThatWillGoInSharedMemory {
boost::optional<int> opt_value;
};

Я использую boost :: interprocess для создания области общей памяти. Насколько я понимаю, boost :: option заключался в том, что это был дискриминационный союз, а не обнуляемый указатель.
В качестве контрпримеров такие вещи, как std :: map и std :: vector, которые используют кучу, нуждаются в явном распределителе, чтобы использовать их в межпроцессной памяти, но boost :: необязательный, я был совершенно уверен, что не использует кучу и эквивалентен пишу:

struct ThingThatWillGoInSharedMemory {
bool value_initialised;
int value;
}

Так что его можно использовать из коробки. Я был бы рад, если бы кто-то подтвердил это — я не видел, чтобы случай с межпроцессным процессом был явно упомянут в документах boost :: option, только подразумеваемый.

5

Решение

Ты прав. Boost :: необязательные обертки значений, а не использование косвенного указателя. Это означает, что простые старые объекты данных, такие как целые, могут жить в областях общей памяти. В общем случае объекты, использующие кучу, не могут использоваться таким образом.

Из буста :: дополнительная документация:

Следует помнить о разнице между необязательным и указателем, особенно потому, что семантика реляционных операторов различна: так как необязательный параметр является оберткой значения …

Boost :: необязательные обертки значения, вместо использования указателей и косвенного Ваша базовая модель надстройки памяти boost :: option более или менее правильна. Фактическая реализация использует объединение, объединяющее общий выровненный байтовый буфер, чтобы избежать необходимости инициализировать объект T. Библиотека использует & (address-of) оператор для получения локально сопоставленного адреса байтового буфера в адресном пространстве процесса. Этот адрес локальной памяти затем приводится к указателю или ссылке типа T.

Исходный код можно найти по адресу <повышение / факультативная / optional.hpp>

1

Другие решения

Других решений пока нет …