在决定是按引用传递还是按值传递时,大小真的是一个问题吗?

Is Size Really A Concern When Deciding Whether To Pass By Reference Or Value?

我想出了以下 table:

+-------------------------------------------------+-----------------------+-----------------+
| Should the callee be able to modify the object? | Is it a large object? |    Semantics    |
+-------------------------------------------------+-----------------------+-----------------+
|                      yes                        |         yes           |    reference    |
|                      yes                        |         no            |    reference    |
|                      no                         |         yes           | const reference |
|                      no                         |         no            |      value      |
+-------------------------------------------------+-----------------------+-----------------+

现在我不太确定 large 对象是什么。当然一切都比指针大,所以 8 字节。但是拿一个 double 的结构,你已经有 8 个字节了。

This answer 讨论了引用的开销。由于这个问题是在 11 多年前提出的,所以我没有费心去那里澄清。如果这真的是一个问题,也许有人可以详细说明,因为创建引用肯定比创建副本更快,不是吗?

I am not asking when to use which semantics. I also know about move. Much more I am interested in:

  1. Does my table make sense?,

  2. Is size of the object really something to consider when deciding on what semantics to chose, since I think you should almost always use ref (AAR (made up and derived from AAA)) except for built-in's maybe? And

  3. What is a large object? Anything larger than 8 Bytes?

答案取决于使用的类型,而不是类型的大小。

看看这个结构

struct SmallButHeavyCopy {
    SmallButHeavyCopy(const SmallButHeavyCopy &) {
        std::this_thread::sleep_for(1000s);
    }
};

它的大小小于指针大小,但复制成本高。

每种类型的问题应该是:

创建对象的引用或副本?什么便宜?

  1. Does my table make sense?,

当然可以。

  1. Is size of the object really something to consider when deciding on what semantics to chose,

可以考虑一下,是的。这不是唯一要考虑的事情。只有当您确定 value 或 const ref 参数比其他选择更合适并且您想在它们之间进行选择时,它才会变得相关。即使那样,除了尺寸之外还有其他考虑因素。例如,您希望避免复制任何重要类型。

  1. What is a large object?

这取决于很多事情。

Anything larger than 8 Bytes?

不一定。

这里有一条经验法则:指针大小的对象和任何小于它的对象肯定是小的。在上面的某个点,你会得到一个足够大的对象,避免复制变得更便宜。那一点将取决于该对象的使用方式。

要找出对于您的特定程序中的特定函数哪个更快,您可以测量