Пожалуйста, рассмотрите следующую структуру:
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, только подразумеваемый.
Ты прав. Boost :: необязательные обертки значений, а не использование косвенного указателя. Это означает, что простые старые объекты данных, такие как целые, могут жить в областях общей памяти. В общем случае объекты, использующие кучу, не могут использоваться таким образом.
Из буста :: дополнительная документация:
Следует помнить о разнице между необязательным и указателем, особенно потому, что семантика реляционных операторов различна: так как необязательный параметр является оберткой значения …
Boost :: необязательные обертки значения, вместо использования указателей и косвенного Ваша базовая модель надстройки памяти boost :: option более или менее правильна. Фактическая реализация использует объединение, объединяющее общий выровненный байтовый буфер, чтобы избежать необходимости инициализировать объект T. Библиотека использует & (address-of) оператор для получения локально сопоставленного адреса байтового буфера в адресном пространстве процесса. Этот адрес локальной памяти затем приводится к указателю или ссылке типа T.
Исходный код можно найти по адресу <повышение / факультативная / optional.hpp>
Других решений пока нет …