当一个对象足够大时,通过引用而不是值传递它会有性能提升吗?

Bar*_*uda 9 c c++ function pass-by-const-reference

正如Charles Bailey 在这个问题中所回答的那样,当对象类型很大但是什么样的对象被认为是大的时候,应该考虑常量引用?

编辑: 确定提供更多可用于提供更具体答案的数据我决定在此描述中添加一个真实世界的问题.

假设我们有一个像这样的对象:

typedef struct dipl {
    quint16 __id;
    quint16 __pos;
    quint16 __len;
} data;
Run Code Online (Sandbox Code Playgroud)

我们有另一个这样的对象:

class bidipl
{
public:
    bidipl();
    quint8 id();
    void setid(quint8 __id);
    void appenddipl(dipl __dipl);
private:
    qint8 _M_id;
    dipllist _M_dipllist;
};
Run Code Online (Sandbox Code Playgroud)

哪里dipllisttypedef QList<dipl> dipllist;.对象diplbidipl创建一次,但每分钟可以访问100次.那么我们应该如何传递dipl给append函数呢?

void appenddipl(dipl __dipl);
Run Code Online (Sandbox Code Playgroud)

要么

void appenddipl(const dipl& __dipl);
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 8

按值传递对象有两个不同的成本:复制数据表示和执行构造函数.你需要考虑两者的成本.

  • 复制数据通常很快,但要保持合理.传递struct { int[7]; }价值是可以的,但可能没那么多struct { int[20000]; }.

  • 执行构造函数可以执行动态分配,这会带来异常风险和同步成本.这可能是微不足道的,或者可能很重要.这取决于.

您应该无条件地通过值传递的唯一变量是字大小的内置类型.对于其他一切,你应该考虑权衡.


bol*_*lov 5

什么应该被认为足够大,以证明通过引用而不是按值传递?您将找到不同的答案:

  • 任何大于处理器上的自然数据类型的东西(x86上的32位,x86-64上的64位):这里甚至std::pair<int, int>应该通过引用传递.

  • 只有容器保持数据到动态存储器位置(例如vectors,strings)

我个人的品味是:按价值原始数据,按参考结构.

通过分析特定体系结构上的特定应用程序,您将找到唯一有效的答案.任何没有实际剖析的性能谈论都是徒劳的.