2013-11-28 3 views
5

Пожалуйста, обратите внимание следующие структуры:Можно ли использовать boost :: optional в межпроцессной памяти?

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

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

struct ThingThatWillGoInSharedMemory { 
    bool value_initialised; 
    int value; 
} 

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

ответ

1

Вы правы. boost :: optional wraps values, вместо использования указателя. Это означает, что обычные объекты данных, такие как int, могут находиться в зонах общей памяти. В общем случае объекты, использующие кучу, не могут использоваться таким образом.

От повышающего :: Дополнительная документация:

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

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

Исходный код можно найти по адресу: <boost/optional/optional.hpp>

 Смежные вопросы

  • Нет связанных вопросов^_^