将指针传递给向量是否比向量本身更快?
Is it faster to pass the pointer to a vector than the vector itself?
在我的程序中,我有一个将多个向量作为参数的函数。我曾经将它们作为法线向量传递,所以函数的定义是这样开始的:
void do(std::vector<int> a, std::vector<int> b, std::vector<int> c){
调用如下所示:
do(d, e, f);
但我希望我的代码尽可能快,所以我想知道是否不传递向量而是传递指向向量的指针会更快。所以函数的定义看起来像这样:
void do(std::vector<int> *a, std::vector<int> *b, std::vector<int> *c){
这样的调用:
do(&d, &e, &f);
此更改对性能有影响吗?如果是:正面或负面,如果我的向量只包含 3 个元素,这会有很大的不同吗?
考虑 C++ 核心指南 F.16: For “in” parameters, pass cheaply-copied types by value and others by reference to const。
复制传递什么便宜什么贵取决于一些因素。一个好的经验法则是通过值传递任何与指针一样大或更小的东西,以及通过引用传递任何更大的东西。 std::vector
当然最好通过 const
引用而不是复制。
当传递 nullptr
是有效参数时,您应该只传递指针而不是引用。当调用者应该总是传递一个向量而不是一个向量时,那么你应该更喜欢引用而不是指针。引用不能为空,它们总是引用一个对象。
请注意,当函数以任何方式复制参数时,有时避免复制是没有意义的。考虑:
void foo(const std::vector<int>& a) {
auto copy = a;
// ...
}
然后
void foo(std::vector<int> a) {
// a is already a copy
// ...
}
更明显的是该函数正在复制,而通过引用传递并没有保存任何内容。
在优化方面,您应该避免按值传递复杂类型。始终使用指针或引用。正如我们在示例中看到的那样,按值传递要慢得多。
在我的程序中,我有一个将多个向量作为参数的函数。我曾经将它们作为法线向量传递,所以函数的定义是这样开始的:
void do(std::vector<int> a, std::vector<int> b, std::vector<int> c){
调用如下所示:
do(d, e, f);
但我希望我的代码尽可能快,所以我想知道是否不传递向量而是传递指向向量的指针会更快。所以函数的定义看起来像这样:
void do(std::vector<int> *a, std::vector<int> *b, std::vector<int> *c){
这样的调用:
do(&d, &e, &f);
此更改对性能有影响吗?如果是:正面或负面,如果我的向量只包含 3 个元素,这会有很大的不同吗?
考虑 C++ 核心指南 F.16: For “in” parameters, pass cheaply-copied types by value and others by reference to const。
复制传递什么便宜什么贵取决于一些因素。一个好的经验法则是通过值传递任何与指针一样大或更小的东西,以及通过引用传递任何更大的东西。 std::vector
当然最好通过 const
引用而不是复制。
当传递 nullptr
是有效参数时,您应该只传递指针而不是引用。当调用者应该总是传递一个向量而不是一个向量时,那么你应该更喜欢引用而不是指针。引用不能为空,它们总是引用一个对象。
请注意,当函数以任何方式复制参数时,有时避免复制是没有意义的。考虑:
void foo(const std::vector<int>& a) {
auto copy = a;
// ...
}
然后
void foo(std::vector<int> a) {
// a is already a copy
// ...
}
更明显的是该函数正在复制,而通过引用传递并没有保存任何内容。
在优化方面,您应该避免按值传递复杂类型。始终使用指针或引用。正如我们在示例中看到的那样,按值传递要慢得多。