3

我有一个boost::ptr_vector需要传递给几个仿函数的对象集合(当前)(我们称之为 vec)。我希望所有的仿函数都有一个指向同一个 vec 的引用/指针,它本质上是一个缓存,这样每个仿函数都有相同的数据缓存。我可以想到三种方法来做到这一点:

  1. 将 a 传递给Functor 类boost::ptr_vector<object>&的构造函数Functor并拥有一个成员boost::ptr_vector<object>&

  2. 将 a 传递boost::ptr_vector<object>*给 Functor 的构造函数并boost::ptr_vector<object>*在 Functor 类中有一个成员

  3. 避免使用boost::ptr_vector并直接将数组 ( object*) 传递给构造函数

我曾尝试使用方法 3,但一直有人告诉我应该使用向量而不是原始指针。因此,我尝试了方法 2,但是由于指针添加了额外的间接级别,这增加了我的程序的延迟。我目前正在使用方法 1,但是我可能需要在仿函数的生命周期内重新分配缓存(因为数据缓存可能会更改),因此这可能不是一个合适的选择。

我不完全理解。我假设仿函数被复制的过程中的某个地方(尽管这些都存储在 ptr_vector 本身中)。

方法 3 最适合我的情况吗?方法 2,太慢了(延迟非常关键),至于方法 1,我一次又一次地被建议使用向量来代替。

非常感谢任何建议

4

1 回答 1

2

C++ 中的引用只能初始化(“绑定”)到变量。

在那之后,引用不能在其生命周期内“重新定位”(使其引用不同的变量)。

这就是为什么可以想象生成默认的复制构造函数,但绝不会生成赋值运算符的原因,因为这需要“更改”引用。

我在这里推荐的方法是使用智能指针而不是引用。

  • std::unique_ptr (最简单,负责分配/解除分配)
  • std::shared_ptr (涉及更多,允许共享所有权)

在这种情况下:

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

似乎很合适

于 2012-11-14T16:08:11.583 回答