在C ++中通过引用传递向量

时间:2016-07-17 13:39:32

标签: c++

假设我定义了以下数据结构:

struct vector
{
    size_t size;
    int *ptr;
}

虽然在上面的代码片段中没有显示,但我在这个结构中添加了一个不错的复制构造函数,因此复制时vector的行为类似于std::vector。如果我想要一个函数来修改vector,我必须通过引用传递它。

void initialize_first_element(vector &v)
{
    if (v.size > 0) v.ptr[0] = 0;
}

这将在C中翻译为

void initialize_first_element(struct vector *v)
{
    if (v->size > 0) v->ptr[0] = 0;
}

但是,由于双重间接*((*v).ptr) = 0,我发现此代码效率低下。相反,我们可以写(在C中)

void initialize_first_element(size_t size, int *ptr)
{
    if (size > 0) ptr[0] = 0;
}

更为常见。

那么,有什么不对吗?有没有一种惯用的方法可以在C ++中实现与C相同的效率水平?

1 个答案:

答案 0 :(得分:2)

首先,只需使用std::vector

其次,在您进行分析之前,没有理由期望此处有重大的性能影响。当指针存在高速缓存未命中时,以下指针主要导致问题,并且内联引用不再是指针而是别名。

第三,实现移动语义。写

vector initialize_first_element(vector v)
{
  if (v.size > 0) v.ptr[0] = 0;
  return v;
}

通过对象传递。

或者,将vector_view写入自然不复制的向量子集中的非拥有视图。

void initialize_first_element(vector_view v)
{
  if (v.size > 0) v.ptr[0] = 0;
}

并完成。

这个最后一个结构在现代C ++ parliance中被称为span,并且在很多情况下都非常有用。