gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:39:56 26 4
gpt4 key购买 nike

我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com