9

正如查尔斯贝利在这个问题中回答的那样,当对象类型很大但什么样的对象被认为是大时,应该考虑通过常量引用传递?

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

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

typedef struct dipl {
    quint16 __id;
    quint16 __pos;
    quint16 __len;
} data;

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

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

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

void appenddipl(dipl __dipl);

或者

void appenddipl(const dipl& __dipl);
4

4 回答 4

8

按值传递对象有两个单独的成本:复制数据表示和执行构造函数。您需要考虑两者的成本。

  • 复制数据通常很快,但要保持在合理范围内。按值传递是可以struct { int[7]; }的,但对于struct { int[20000]; }.

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

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

于 2014-08-12T21:22:22.450 回答
5

什么应该被认为足够大以证明通过引用而不是按值传递是合理的?你会发现不同的答案:

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

  • 数据保存到动态内存位置的容器(例如vectorsstrings

我个人的品味是:原始数据按值,结构按引用。

通过在特定架构上分析特定应用程序,您会找到唯一有效的答案。任何没有实际分析的关于性能的讨论都是徒劳的

于 2014-08-12T21:56:03.207 回答
3

正如查尔斯所说,当所讨论的值的大小等于或小于对象引用的大小时,仅传递值而不是引用会明显提高性能。但是,由于访问该值可能需要取消引用操作,这取决于有关上下文的详细信息以及编译器的“智能”程度,因此传递一个大小略大于引用的值仍然可能是“值得的”。然而,这开始分裂头发并且很少显着。

于 2014-08-12T21:11:39.517 回答
-2

任何不是基本类型的东西,即任何类对象、结构或容器

于 2014-08-12T21:15:33.523 回答