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