Быстрый вопрос по проектированию контейнерных классов C ++ в общей памяти

Я пишу простую оболочку вокруг векторного контейнера boost :: interprocess для реализации кольцевого буфера в общей памяти (shm) для IPC. Предположим, что buf - это экземпляр RingBuffer, созданный в shm. Теперь в своем ctor buf сам выделяет частный boost::interprocess::vector элемент данных для хранения значений, например m_data. Мой вопрос: я думаю, что m_data также следует создавать в общей памяти. Но разве это необходимость?

Что произойдет, если buf, созданный в самом shm, выделит стандартную память, то есть с помощью new. Распределяется ли это в куче вызывающего процесса? Я не думаю, что там выделяется buf, поэтому почему член данных, который является частным для объекта, не находящегося в куче процесса, выделяется там. Я смущен.


person recipriversexclusion    schedule 17.03.2010    source источник


Ответы (1)


boost::interprocess::vector принимает тип распределителя в качестве параметра шаблона. Этот распределитель необходимо выделять из общей памяти (см. Примеры использования).

Если ваш класс выделяет память с помощью new, тогда эта память будет доступна только из процесса, в котором она была выделена. Это неверно, и именно поэтому boost::interprocess::vector нужен распределитель разделяемой памяти.

в своем ctor, buf сам выделяет частный член данных boost :: interprocess :: vector

Для меня это не имеет смысла. В C ++ нельзя «выделить» член данных в конструкторе. Члены данных определены в теле класса и являются частью каждого объекта этого класса. Они находятся в той же памяти, что и объект, по той же причине, что средний байт 4-байтового целого числа находится в той же памяти, что и целое число.

почему член данных, который является частным для объекта, не находящегося в куче процесса, выделяется там

Память распределяется так, как вы просите ее выделить. Если вы выделяете new (и он не был перегружен), он выделяется в памяти процесса. Если вы распределяете с помощью диспетчера сегментов разделяемой памяти (как я думаю, это называется Boost - я сам фактически не использовал эти API), он выделяется в разделяемой памяти. Класс, содержащий вызов, и элемент данных, в котором вы храните указатель на выделенную память, не имеют к этому никакого отношения.

person Steve Jessop    schedule 17.03.2010
comment
Спасибо, Стив, это проясняет мою путаницу. Мой оставшийся вопрос: должен ли класс buf, созданный в shm, использовать boost::interprocess::vector или std::vector для хранения своих данных? Я думаю, это должна быть повышенная версия, просто хотел знать, правильно ли это. - person recipriversexclusion; 17.03.2010
comment
Да, это должен быть межпроцессный процесс. std::vector выделяет память и сохраняет на нее указатели. По умолчанию он выделяет с помощью new, что, как мы знаем, было бы неправильно. Но даже если вы дадите std::vector распределитель, который выделяется из общей памяти, это будет все равно неверно, потому что общая память может не отображаться в один и тот же диапазон адресов во всех процессах, и если это не так тогда указатели не будут работать. boost::interprocess::vector занимается этим за вас. - person Steve Jessop; 17.03.2010