在决定是按引用传递还是按值传递时,大小真的是一个问题吗?
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:
Does my table make sense?,
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
What is a large
object? Anything larger than 8 Bytes?
答案取决于使用的类型,而不是类型的大小。
看看这个结构
struct SmallButHeavyCopy {
SmallButHeavyCopy(const SmallButHeavyCopy &) {
std::this_thread::sleep_for(1000s);
}
};
它的大小小于指针大小,但复制成本高。
每种类型的问题应该是:
创建对象的引用或副本?什么便宜?
- Does my table make sense?,
当然可以。
- Is size of the object really something to consider when deciding on what semantics to chose,
可以考虑一下,是的。这不是唯一要考虑的事情。只有当您确定 value 或 const ref 参数比其他选择更合适并且您想在它们之间进行选择时,它才会变得相关。即使那样,除了尺寸之外还有其他考虑因素。例如,您希望避免复制任何重要类型。
- What is a large object?
这取决于很多事情。
Anything larger than 8 Bytes?
不一定。
这里有一条经验法则:指针大小的对象和任何小于它的对象肯定是小的。在上面的某个点,你会得到一个足够大的对象,避免复制变得更便宜。那一点将取决于该对象的使用方式。
要找出对于您的特定程序中的特定函数哪个更快,您可以测量。
我想出了以下 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:
Does my table make sense?,
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
What is a
large
object? Anything larger than 8 Bytes?
答案取决于使用的类型,而不是类型的大小。
看看这个结构
struct SmallButHeavyCopy {
SmallButHeavyCopy(const SmallButHeavyCopy &) {
std::this_thread::sleep_for(1000s);
}
};
它的大小小于指针大小,但复制成本高。
每种类型的问题应该是:
创建对象的引用或副本?什么便宜?
- Does my table make sense?,
当然可以。
- Is size of the object really something to consider when deciding on what semantics to chose,
可以考虑一下,是的。这不是唯一要考虑的事情。只有当您确定 value 或 const ref 参数比其他选择更合适并且您想在它们之间进行选择时,它才会变得相关。即使那样,除了尺寸之外还有其他考虑因素。例如,您希望避免复制任何重要类型。
- What is a large object?
这取决于很多事情。
Anything larger than 8 Bytes?
不一定。
这里有一条经验法则:指针大小的对象和任何小于它的对象肯定是小的。在上面的某个点,你会得到一个足够大的对象,避免复制变得更便宜。那一点将取决于该对象的使用方式。
要找出对于您的特定程序中的特定函数哪个更快,您可以测量。