代码之家  ›  专栏  ›  技术社区  ›  Humam Helfawi

按价值或参考传递容器

  •  6
  • Humam Helfawi  · 技术社区  · 8 年前

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

    假设这种情况:

    class image{
        image()=default;
        image(image const&)=default;
        ~image()=default;
    
        int w;
        int h;
        uchar* data;
    }
    

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

    引发这个问题的原因是我读到了 iterators 在C++中,它们被设计为轻量级的,并通过值传递。因此,我认为这个概念可以应用于表示实际数据容器的类,而不是数据。

    2 回复  |  直到 8 年前
        1
  •  6
  •   jupp0r    8 年前

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

    cpp parameter passing overview .

        2
  •  5
  •   Community Ian Goodfellow    7 年前

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

    这个差异是如此之小,以至于无论你是通过值还是通过引用传递它都无关紧要。后者可能是 轻微地 更快,因为指针可能总是可以通过CPU寄存器和12个字节传入 也许 不是,但这是真正的微观优化。

    就我个人而言,除了原始类型之外,我什么都不做( const )默认情况下,除非我有理由不这样做(参见 jupp0r's answer ). 开发过程中的主要优势是,随着类的增长,我不必担心它什么时候会变成 并将我的所有函数更改为通过引用传递。

    就默认的C++迭代器而言:请注意,它们是 意味 基本上只是指针。事实上,我知道对于在启用了优化的发布模式下编译的Microsoft Visual C++ std::vector 将减少到这一点。我不知道其他编译器是否也这样做,我想是这样的。然而,您会注意到,如果禁用优化,那么编写 it++ ++it 例如,循环中的增量-纯粹是因为前一种情况下的额外复制操作。因此,如果你经常这样做,即使“抄袭成本低”也可能产生影响。一如既往:当担心绩效时,根据数字进行衡量和决定。