C编程:按值传递的成本

C编程:按值传递的成本,c,memory-management,stack,pass-by-reference,C,Memory Management,Stack,Pass By Reference,我正在学习C,对我在网上读到的东西感到困惑 在 我可以读到: 让我们看看决定空与满的函数。 现在,不需要通过引用这些来传递堆栈 函数,因为它们不会更改堆栈。所以,我们可以制作原型 它们是: int StackIsEmpty(stackT stack); int StackIsFull(stackT stack); 但是,一些堆栈函数将使用指针(例如。, 对于StackInit(),我们需要它们,而有些则不需要。更多 一致,只通过引用传递堆栈(使用指针)所有 时间 (我没有显示stackT的代码

我正在学习C,对我在网上读到的东西感到困惑

我可以读到:

让我们看看决定空与满的函数。 现在,不需要通过引用这些来传递堆栈 函数,因为它们不会更改堆栈。所以,我们可以制作原型 它们是:

int StackIsEmpty(stackT stack);
int StackIsFull(stackT stack);
但是,一些堆栈函数将使用指针(例如。, 对于StackInit(),我们需要它们,而有些则不需要。更多 一致,只通过引用传递堆栈(使用指针)所有 时间

(我没有显示stackT的代码,它只是一个动态数组)

根据我(可能有限)的理解,按值传递的缺点是数据在函数的堆栈内存中重复。因为stackT可能很大,所以按值而不是指针传递将非常耗时


我是否理解正确,或者我仍然不清楚基本原理?

正确,如果您通过值传递某个“大”项,则该项将复制到堆栈中

传递指向数据的指针可以避免复制


在大多数实际应用程序中,性能差异是否有意义是值得怀疑的,除非“大”实际上是“大”(这反过来可能会使堆栈溢出)。

正确,如果通过值传递某个“大”值,则该项将复制到堆栈上

传递指向数据的指针可以避免复制


性能差异在大多数实际应用程序中是否有意义是值得怀疑的,除非“大”实际上是“大”(这反过来可能会使堆栈溢出)。

您是正确的。按值传递会导致程序完整复制该参数中的所有数据。如果只有一个或两个整数,没问题,但是复制多个千字节是非常昂贵的。通过引用传递仅复制指针。

但是,您必须注意更改指针指向的数据,然后期望返回到它不变。C++已经通过了“const引用”,这是保证数据不会被更改,但是C没有。按值传递会导致程序完整复制该参数中的所有数据。如果只有一个或两个整数,没问题,但是复制多个千字节是非常昂贵的。通过引用传递仅复制指针。

但是,您必须注意更改指针指向的数据,然后期望返回到它不变。C++已经通过了“const引用”,这是保证数据不会被改变,但是C没有。< / P> C.中没有通过引用。它仍然是按值传递的,但它是指针的值只是想知道,你怎么能按值传递“大”的东西?即使您传递一个静态分配的数组,它也将通过类似
array[]
的指针传递。对于动态分配的数组,必须传递指向函数的指针。我能想到的唯一一件事是一个有很多成员的结构…这是离题的,但显然,如果在一个结构中有一个静态分配的数组,那么该数组将完全按值传递(即在函数中完全复制)。这可能是导致堆栈溢出的最简单的方法-通过按值传递具有大型静态分配数组的结构。@jucestain它也常用于按值返回数组,尽管它们通常很小。@WhozCraig您可以发布一个链接,以获得有关按值返回数组的更多信息吗?我不明白为什么有人会这么做,除非他们可能需要在函数中复制一个静态数组?C中没有通过引用传递。。。它仍然是按值传递的,但它是指针的值只是想知道,你怎么能按值传递“大”的东西?即使您传递一个静态分配的数组,它也将通过类似
array[]
的指针传递。对于动态分配的数组,必须传递指向函数的指针。我能想到的唯一一件事是一个有很多成员的结构…这是离题的,但显然,如果在一个结构中有一个静态分配的数组,那么该数组将完全按值传递(即在函数中完全复制)。这可能是导致堆栈溢出的最简单的方法-通过按值传递具有大型静态分配数组的结构。@jucestain它也常用于按值返回数组,尽管它们通常很小。@WhozCraig您可以发布一个链接,以获得有关按值返回数组的更多信息吗?我不明白为什么有人会这样做,除非他们可能需要在函数中复制一个静态数组?即使传递几个KB,虽然通常不是很好的做法,但与典型应用程序中的其他成本相比,可能也不是“非常昂贵”。遵守C中的const限定符,您也可以享受同样的好处
int-StackIsEmpty(stackT-const*stack)
即使传递几个KB,虽然通常不是很好的做法,但与典型应用程序中的其他成本相比,可能也不是“非常昂贵”。使用C语言中的const限定符,您也可以享受同样的好处<代码>整数堆栈空(堆栈常量*堆栈)