按值或按引用传递容器

时间:2016-01-27 08:37:48

标签: c++ c++11 pass-by-reference pass-by-value

我知道在一般情况下传递值,引用或指针之间的差异。但是,我的问题是关于一个结构简单的容器的特殊情况。

假设这种情况:

class image{
    image()=default;
    image(image const&)=default;
    ~image()=default;

    int w;
    int h;
    uchar* data;
}

当传递这个类的对象时,复制的只是两个整数而指针而不是整个数据。在这种情况下是否有目的通过引用传递它?或者有没有通过引用传递它的目的?

引发这个问题的是我已经读过C ++中的iterators被设计为轻量级并且通过值传递。所以,我认为这个概念可以应用于代表容器的类到实际数据而不是数据。

2 个答案:

答案 0 :(得分:6)

Imho,关于如何传递参数的最佳指南可以在Herb Sutters的优秀演讲Back to the Basics! Essentials of Modern C++ Style中找到。在您的特定情况下,按值传递将是最佳选择,因为您的结构复制起来很便宜。

cpp parameter passing overview

答案 1 :(得分:5)

使用默认的复制构造函数,任何副本都会很浅,并且不会复制data指向的内存。因此,当您通过引用传递时,只传递两个整数和指针,总共大约12 bytes(取决于您的体系结构,指针大小)。

这种差异是如此之小,以至于您是通过价值还是通过参考传递它并不重要。后者可能稍微更快,因为指针可能总是通过CPU寄存器传入,12字节可能没有,但这实际上是微优化。

除非我有理由不(参见jupp0r's answer),否则我个人通过(const)引用传递除原始类型之外的任何内容。开发过程中的主要优点是,随着类的增长,我不必担心它何时变得大并且改变我的所有函数以通过引用传递。

就默认的C ++迭代器而言:注意它们意味着基本上只是指针。实际上我知道,对于在发布模式下启用优化的Microsoft Visual C ++编译,连续数据结构(如std::vector)的迭代器将减少到这一点。我不知道其他编译器是否也这样做,我会这么认为。但是,您会注意到,如果禁用优化,那么突然在循环增量中写it++++it之间存在差异 - 例如 - 完全是因为前一种情况下的附加复制操作。因此,如果你经常这么做,即使“便宜复制”也可能产生影响。像往常一样:当担心表现时,根据数字来衡量和决定。