确定是通过引用还是通过值时是否真的需要关注大小?

问题描述 投票:1回答:2

我想出了下表:

+-------------------------------------------------+-----------------------+-----------------+
| 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年前提出的,所以我没有在这里要求澄清。如果确实需要解决,也许有人可以详细介绍一下,因为创建引用肯定比创建副本快,不是吗?

我不是要何时使用哪个语义。我也知道move。我更感兴趣的是:

  1. 我的桌子有意义吗?,

  2. 对象的
  3. size在决定选择哪种语义时确实要考虑一些问题,因为我认为您几乎应该始终使用ref(AAR(由AAA组成并派生自)),除了-也许吧?和

  4. 什么是large对象?是否大于8个字节?

c++ size pass-by-reference semantics pass-by-value
2个回答
0
投票

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

看这个结构

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

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

每种类型的问题应该是:

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


0
投票
  1. 我的桌子有意义吗?,

确定

  1. 决定对象的语义时,是否确实要考虑对象的大小,

可以考虑,是的。这不是唯一要考虑的事情。仅当您确定value或const ref参数比其他选择更合适并且要在它们之间进行选择时,它才有意义。即使这样,除了大小以外,还有其他注意事项。例如,您要避免复制任何非平凡的类型。

  1. 什么是大物体?

取决于很多事情。

是否大于8个字节?

不一定。

这是一个经验法则:指针大小的对象,比该对象小的任何对象都绝对很小。在此之上的某个点,您将获得足够大的对象,这样它就可以避免复制而变得更便宜。这一点将取决于该对象的使用方式。

要找出特定程序中特定功能哪个更快,您可以测量

© www.soinside.com 2019 - 2024. All rights reserved.