C++:成员引用还是指针?

3
我有一个对象集合(目前使用的是 `boost::ptr_vector`),需要传递给几个函数对象。我希望所有函数对象都引用/指向同一个缓存对象 vec,以便每个函数对象都具有相同的数据缓存。我想到了三种方法来实现这一点:
1. 在 `Functor` 的构造函数中传递一个 `boost::ptr_vector&`,并在 `Functor` 类中拥有一个 `boost::ptr_vector&` 成员。 2. 在 `Functor` 的构造函数中传递一个 `boost::ptr_vector*`,并在 `Functor` 类中拥有一个 `boost::ptr_vector*` 成员。 3. 避免使用 `boost::ptr_vector`,直接将数组(`object*`)传递给构造函数。
我尝试过第三种方法,但一直被告知应该使用 vector 而不是原始指针。因此,我尝试了方法 2,但由于指针添加了额外的间接层,导致程序延迟增加。我目前正在使用方法 1,但在函数对象的生命周期内可能需要重新分配缓存(因为数据缓存可能会更改),因此这可能不是一个合适的替代方案。
我不完全理解其中的问题。我猜测函数对象在某个地方被复制了(虽然它们都存储在 ptr_vector 中)。
在我的情况下,哪种方法是最好的?方法 2 太慢(延迟非常关键),至于方法 1,我一次又一次地被建议使用 vector。
非常感谢您提供任何建议。

当你在不同的方法之间切换时,你是否忘记了签名中的 * - Constantin
@Constantin,就是这样,将问题中的错误删除并使其更加普遍化,关于我应该使用哪种方法。 - Aly
1个回答

2

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

在那之后,引用在其生命周期内无法“重新设置”(使其指向不同的变量)。

这就是为什么默认的复制构造函数可以被生成,但永远不会生成赋值运算符,因为那需要改变引用。

我的建议是使用智能指针而不是引用。

  • std::unique_ptr(最简单的,负责分配/释放内存)
  • std::shared_ptr(更复杂,允许共享所有权)

在这种情况下:

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

看起来似乎很匹配。


@Aly 通过值传递 shared_ptr。 - juanchopanza
@sehe 如果我传值,每个Functor都会有一个shared_ptr对象的副本,但它们都将共享相同的底层指针,对吗? - Aly
@sehe 哦,我明白了,所以我可以使用 shared_ptr 指向数组(而不是 vector),这相当于 obj(原始指针),但清理工作由 shared_ptr 处理?但如果我使用 shared_ptr 的 vector,则相当于 vector,这会增加我不想要的间接层。 - Aly
@juanchopanza 对不起,请问在哪里传递 ref<Functor>? - Aly
@Aly,你可能正在将函数对象传递到某个地方进行复制,因此出现了问题。所以应该传递std::ref。 - juanchopanza
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接