【问题标题】:C++:member reference or pointer?C++:成员引用还是指针?
【发布时间】:2012-11-14 16:00:41
【问题描述】:

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

  1. boost::ptr_vector<object>& 传递给Functor 的构造函数并在Functor 类中有boost::ptr_vector<object>& 成员

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

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

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

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

方法 3 最适合我的情况吗?方法二,太慢了(延迟很关键),至于方法一,我一再被建议改用向量。

非常感谢任何建议

【问题讨论】:

  • 在方法之间切换时您是否忘记了签名中的*
  • @Constantin 就是这样,从问题中删除了错误并使其更普遍地了解我应该使用哪种方法

标签: c++ arrays pointers reference ptr-vector


【解决方案1】:

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

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

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

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

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

在这种情况下:

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

看起来很合适

【讨论】:

  • 啊,它肯定需要重新安装,因为数据缓存可能会发生变化。如果我使用 shared_ptr,如何将它传递给构造函数?作为参考(shared_ptr<...>&),如果在分配期间是这样,它不会复制这个对象吗?
  • @Aly 按值传递 shared_ptr。
  • @Aly 按值或按引用应该都可以等效地工作。事实上,根据实际情况,对于哪种变体可以让编译器生成最佳代码存在一些争议(请参阅已发表的问答采访,其中 Herb Sutter 和 Andrei Alexandrescu 回答了这个问题以及一些博客文章)。在这种情况下,我会写下意图,即“通过引用”
  • @juanchopanza 强调我的观点 ^"Want Speed, Pass By value" (D.Abrahams) 浮现在脑海中。让我看看能不能找到问答视频链接。
  • @juanchopanza 但是,这仍然是一个指针,并且会增加使用数组不正确的延迟?
猜你喜欢
  • 1970-01-01
  • 2020-11-18
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 2011-12-13
  • 2018-03-24
相关资源
最近更新 更多