Voici l'exemple officiel d'utilisation du vecteur en mémoire partagée entre processus:

http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess/quick_guide.html#interprocess.quick_guide.qg_interprocess_container

Cependant, j'ai encore quelques inquiétudes:

  1. et si le vecteur a besoin de réallouer de la nouvelle mémoire (par exemple après plusieurs push_back)?

  2. et si le vecteur continue d'augmenter et consomme finalement toute la mémoire initialisée?

  3. quelle est la pénalité de performance en comparant avec le vecteur STL original?

1
skygragon 16 janv. 2017 à 12:03

2 réponses

Meilleure réponse
  1. Il le fait via le ShmemAllocator personnalisé. C'est ainsi que fonctionnent les allocateurs: vous remplacez l'allocateur de tas standard qui appelle new par celui de Boost qui alloue à partir du segment de mémoire partagée.

  2. Même comportement que manquer de mémoire avec l'allocateur standard: une exception sera levée (pas std::bad_alloc cependant: c'est apparemment boost::interprocess::bad_alloc à la place).

  3. Vous voudrez comparer la vitesse d'allocation de l'allocateur Boost et la comparer à celle de std::allocator, qui est la valeur par défaut. Le vecteur lui-même n'a pas vraiment d'importance.

1
Quentin 16 janv. 2017 à 09:13

Il y a 2 entités distinctes ici

  1. Vecteur
  2. Allocateur

Lorsque vous créez vector en tant que

vector <int> v1;

C'est en fait

vector<int, allocator<int>> v1; 

Nous ne fournissons pas d'allocateur de mémoire car c'est l'allocateur par défaut.

Maintenant, dans le cas de la communication Boost.Interprocess, le vecteur est créé comme

typedef vector<int, ShmemAllocator> MyVector

Où l'allocateur de mémoire est changé en Allocateur de mémoire partagée à partir de l'allocateur par défaut.

Ainsi, la fonctionnalité de vector est indépendante de l'allocateur de mémoire utilisé.

En ce qui concerne les questions, la disponibilité de la mémoire et la vitesse d'allocation dépendent des allocateurs et non des vecteurs, tant que les allocateurs parviennent à obtenir de la mémoire, les vecteurs continueront à fonctionner.

0
Daksh 16 janv. 2017 à 09:15