2013-11-28 16 views
5

Proszę rozważyć następujące struktury:Czy można bezpiecznie używać boost :: opcjonalnie w pamięci międzyprocesowej?

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

używam boost :: Interprocess stworzyć wspólny obszar pamięci. Moje rozumienie boost: opcjonalne było to, że był to związek dyskryminowany, a nie wskaźnik zerowy. Jako kontrprzykłady takie jak std :: map i std :: vector, które używają sterty, potrzebują jednoznacznego przydziału, aby użyć ich w pamięci międzyprocesowej, ale boost :: opcjonalnie, byłem dość pewny, że nie używam sterty i jest równoważny na pisanie:

struct ThingThatWillGoInSharedMemory { 
    bool value_initialised; 
    int value; 
} 

Dzięki temu można go używać bez pudełka. Byłbym zachwycony, gdyby ktoś to potwierdził - nie widziałem, aby przypadek międzyprocesowy był wyraźnie wspomniany w podpowiedziach :: opcjonalnych, tylko dorozumianych.

Odpowiedz

1

Masz rację. boost :: opcjonalne wartości wrapping, a nie za pomocą wskaźnika kierunku. Oznacza to, że zwykłe stare obiekty danych, takie jak int, mogą mieszkać we wspólnych obszarach pamięci. Zasadniczo obiekty wykorzystujące stertę nie mogą być używane w ten sposób.

Z boost :: opcjonalny dokumentacji:

Różnica między opcjonalnym i wskaźnika należy pamiętać, szczególnie dlatego, że semantyka operatorów relacyjnych są różne: od opcja jest value- wrapper ...

doładowanie :: Opcjonalne wartości wrapping, zamiast użycia wskaźników i indeksu. Twój podstawowy model układu boost: opcjonalny układ pamięci jest mniej więcej poprawny. Rzeczywista implementacja wykorzystuje zwijanie zbiorcze ogólnego wyrównanego bufora bajtowego, aby uniknąć konieczności zainicjowania obiektu T. Biblioteka używa operatora & (adres-of), aby uzyskać lokalnie zmapowany adres bufora bajtowego w przestrzeni adresowej procesu. Ten lokalny adres pamięci jest następnie rzutowany na wskaźnik lub referencję typu T.

Kod źródłowy można znaleźć pod adresem <boost/optional/optional.hpp>

Powiązane problemy