假设我定义了以下数据结构:
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相同的效率水平?
答案 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
,并且在很多情况下都非常有用。