c++ - 通过引用传递 C++

标签 c++ pass-by-reference

我的 C++ 老师告诉我,只有在我不打算更改函数内数组的任何内容时,才应使用按引用调用。 我在我的程序中传递了一些非常大的 vector 。所有的 vector 都将在函数内部被修改。我的矩阵大小约为 [256*256][256][50]...

这里有不使用引用调用的特殊原因吗?

AFAIK 通过引用调用应该更快并且消耗更少的内存?

最佳答案

除了关于何时以及如何传递非基本类型的可能 const 引用的所有常见讨论之外,数组在这里非常特殊。

由于与 C 的向后兼容性,并且由于您的特定问题:数组可能很大,数组在 C 或 C++ 中从未真正按值传递。该数组将退化为指向第一个元素的指针,因此当您编写:

void foo( type array[100] );

编译器实际处理的是:

void foo( type *array );

不管数组的大小是多少(那里有两个常见的陷阱:相信 arrayfoo 中的一个数组并相信它一定是 100上的元素。

现在,在 C++ 中,您实际上可以通过引用传递数组,但引用必须是数组的具体类型,包括大小:

void foo_array( type (&array)[100] );

有趣的语法告诉编译器该函数将采用一个恰好包含 100 个类型为 type 的元素的数组。这样做的好处是编译器可以为您执行大小检查:

// assuming 'type' is defined
int main() {
   type array0[99];
   type array1[100];

   foo( array0 );     // compiles, but if size=100 is assumed it will probably break
                      // equivalent to: foo( &array0[0] )
   // foo2( array0 ); // will not compile, size is not 100
   foo2( array1 );    // compiles, size is guaranteed to be 100
}

现在的问题是,您的函数仅适用于恰好包含 100 个元素的数组,在某些情况下,您可能希望对不同的数组大小执行相同的操作。两个解决方案是:模板大小为数组大小的函数,它将为每个使用的大小提供大小安全的实现——更大的编译时间和二进制大小,模板为每个不同的大小编译——或使用传递——按值语法,这将使数组衰减——大小不安全,必须作为额外参数传递,编译时间和二进制大小更小。第三种选择是将两者结合起来:

void foo( type *array, int size );
template <size_t N>
void foo( type (&array)[N] ) {
   foo( array, N );
}

在这种情况下,虽然每个大小都有一个模板化的 foo,但编译器很可能会内联调用,并且生成的代码将等同于提供数组和大小的调用者。真正的数组不需要额外的计算和类型安全。

现在,引用传递很少用于数组。

关于c++ - 通过引用传递 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2273285/

相关文章:

c++ - 使用 fprintf 时的细微差别

c++ - 了解 VTune 报告

c++ - 将 QThread 移动到另一个线程?

perl - 为什么 Perl 允许通过引用传递参数?

php - 关于引用参数或显式返回值的 PHP 方法的最佳实践

lisp - 在 Common Lisp 中通过对象引用传递

c++ - 使用正则表达式排除 C++ 中的子文件夹

C++ TTmath : Power of?

c - 在链表中使用双指针的目的

谁能解决我的错误