我想出了下表:
+-------------------------------------------------+-----------------------+-----------------+
| 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
。我更感兴趣的是:
- 对象的
我的桌子有意义吗?,
是size在决定选择哪种语义时确实要考虑一些问题,因为我认为您几乎应该始终使用ref(AAR(由AAA组成并派生自)),除了-也许吧?和
什么是
large
对象?是否大于8个字节?
答案取决于所使用的类型,而不取决于类型的大小。
看这个结构
struct SmallButHeavyCopy {
SmallButHeavyCopy(const SmallButHeavyCopy &) {
std::this_thread::sleep_for(1000s);
}
};
它的大小小于指针的大小,但是复制成本很高。
每种类型的问题应该是:
创建引用还是创建对象的副本?什么便宜?
- 我的桌子有意义吗?,
确定
- 决定对象的语义时,是否确实要考虑对象的大小,
可以考虑,是的。这不是唯一要考虑的事情。仅当您确定value或const ref参数比其他选择更合适并且要在它们之间进行选择时,它才有意义。即使这样,除了大小以外,还有其他注意事项。例如,您要避免复制任何非平凡的类型。
- 什么是大物体?
取决于很多事情。
是否大于8个字节?
不一定。
这是一个经验法则:指针大小的对象,比该对象小的任何对象都绝对很小。在此之上的某个点,您将获得足够大的对象,这样它就可以避免复制而变得更便宜。这一点将取决于该对象的使用方式。
要找出特定程序中特定功能哪个更快,您可以测量。