массивы — C ++: ссылка на член или указатель?

У меня есть коллекция (в настоящее время boost::ptr_vector) объектов (давайте назовем это vec), которые нужно передать нескольким функторам. Я хочу, чтобы у всех функторов была ссылка / указатель на один и тот же vec, который по сути является кешем, чтобы у каждого функтора был одинаковый кеш данных. Есть три способа сделать это:

  1. Проходя boost::ptr_vector<object>& конструктору Functor и имея boost::ptr_vector<object>& член в классе Functor

  2. Проходя boost::ptr_vector<object>* к конструктору Functor и имея boost::ptr_vector<object>* член в классе Functor

  3. избегать использования boost::ptr_vector и напрямую передать массив (object*) конструктору

Я пытался использовать метод 3, но мне постоянно говорили, что я должен использовать вектор вместо необработанного указателя. Итак, я попробовал метод 2, но это добавило задержки моей программе из-за дополнительного уровня косвенности, добавленного указателем. В настоящее время я использую метод 1, однако мне может потребоваться переназначить кэш в течение времени жизни функтора (поскольку кэш данных может измениться), так что это может оказаться неподходящей альтернативой.

Что я не до конца понимаю. Я предполагаю, что где-то по пути копируется функтор (хотя все они хранятся в самом ptr_vector).

Является ли метод 3 лучшим для моего случая? метод 2 слишком медленный (задержка очень важна), а что касается метода 1, мне снова и снова советовали использовать векторы.

Любой совет высоко ценится

3

Решение

Ссылка в C ++ может быть только инициализирована (‘привязана’) к переменной.

После этого момента ссылка может не быть «пересаженным» обращаться к другой переменной) в течение его жизни.

Вот почему конструктор копирования по умолчанию может быть сгенерирован, но не оператор присваивания, так как для этого потребуется «изменить» ссылку.

Мой рекомендуемый подход здесь — использовать умный указатель вместо ссылки.

  • std :: unique_ptr (самый простой, заботится о распределении / освобождении)
  • std :: shared_ptr (более сложный, позволяет разделить владельца)

В этом случае:

std::shared_ptr<boost::ptr_vector<object> > m_coll;

казалось бы, хорошо подходит

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]