按值或按引用传递容器

Hum*_*awi 6 c++ pass-by-reference pass-by-value c++11

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

假设这种情况:

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

    int w;
    int h;
    uchar* data;
}
Run Code Online (Sandbox Code Playgroud)

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

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

jup*_*p0r 6

Imho,关于如何传递参数的最佳指南可以在Herb Sutters的优秀演讲中找到 回归基础知识!现代C++风格的要点.在您的特定情况下,通过值传递将是最佳选择,因为您的结构复制起来很便宜.

cpp参数传递概述.


Com*_*hip 5

使用默认的拷贝构造函数,任何副本将是浅薄,不会使记忆的副本指出data.因此,当您通过引用传递时,将只传递两个整数和指针,总共大约12个字节(取决于您的体系结构,指针大小).

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

我个人通过(const)引用传递除了原始类型之外的任何东西,默认情况下,除非我有理由不这样做(参见jupp0r的答案).在开发过程中的主要优点是随着类的增长,我不必担心它何时变得太大并且改变我的所有函数以通过引用传递.

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