按值或引用传递容器

Passing containers by value or by reference

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

假设这种情况:

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

    int w;
    int h;
    uchar* data;
}

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

引发这个问题的是我读到 C++ 中的 iterators 被设计为轻量级并按值传递。所以,我认为这个概念可能适用于 classes,它表示一个容器到实际数据没有数据。

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

.

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

差异如此之小,以至于按值传递还是按引用传递都无关紧要。后者可能 稍微 更快,因为指针可能总是可以通过 CPU 寄存器传入,而 12 个字节 可能 不会,但那确实是 micro-optimization.

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

就默认的 C++ 迭代器而言:请注意,它们 意味着 基本上只是指针。事实上,我知道对于在启用优化的发布模式下编译的 Microsoft Visual C++,连续数据结构(例如 std::vector )的迭代器将减少到仅此。我不知道其他编译器是否也这样做,我想是的。但是您会注意到,如果您禁用优化,那么突然之间在循环增量中写入 it++++it 之间会有所不同,例如 - 纯粹是因为前一种情况下的额外复制操作。因此,如果您经常这样做,即使 "cheap to copy" 也可能会产生影响。照例:担心性能时,根据数字衡量和决定。