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

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

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

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

struct ThingThatWillGoInSharedMemory {
    bool value_initialised;
    int value;
}

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


person Benedict    schedule 28.11.2013    source источник


Ответы (1)


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

Из документации boost::Optional:

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

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

Исходный код можно найти по адресу ‹boost/Optional/Optional.hpp›

person fredbaba    schedule 29.12.2013