按值管理函数参数与引用内存管理

Function parameter by value vs reference memory managment

我正在尝试了解 C 语言,更具体地说是关于内存管理。我有一个函数 func 接受 1 个参数,一个 int 指针。如果我使用 int i 而不是 int *i 它将分配更多内存,因为该值将被复制。因为我知道 func1func2 都不会改变 i 变量,所以这两个函数的结果是完全一样的。

如果我多次调用这些函数会发生什么?显然 func1 会表现得更好,对吗? func2 呢?它会在每次调用时分配新内存吗?那么分配 10000 * 4 个额外字节?或者只是 4 个额外的字节?

我想它分配了 4 个额外的字节,如果确实是,这个内存是什么时候分配的?是第一次调用函数的时候吗?此外,这 4(?)字节的内存将如何以及何时变为空闲?

void func1(int *i)
{
}

void func2(int i)
{
}

void main()
{
    int x = 100;
    for(int i = 0; i < 10000 ; i++) func1(&x);
    for(int i = 0; i < 10000 ; i++) func2(x);
}

这可能是特定于编译器的(您可以查看 C 规范来确定),但应该在函数的调用堆栈上分配整数参数。每次调用该函数时,都会分配额外的 4 个字节供其使用,当函数 returns.

时将被释放

对于函数的引用版本,它会在每次函数调用时为 int 指针分配 space。根据您的机器,它可能更大、更小或与 int 大小相同。比较 sizeof(int)sizeof(int*) 看哪个更大。

C 标准没有指定如何传递参数,但是,在大多数 C 实现中,参数使用的内存会在调用堆栈上自动分配和释放,与堆分配相比,开销很小。通常,内存在传递参数时在堆栈上分配,并在函数 returns.

之前或之时释放

两个版本的函数都将在调用堆栈上分配内存。参考版本将为指针分配内存。并且参考版本可能更慢,因为它涉及指针解引用。

说一下存储时长,是指对象(执行环境中数据存储的区域,其内容可以表示值)命名的时长变量存在。没有显式存储持续时间或存储持续时间 autoregister 的函数参数和局部变量具有 自动存储持续时间。 也就是说,它们在声明时创建,并且当包含它们的函数 returns.

时被销毁

在函数调用中,为参数指定的值被复制到表示函数定义中参数的自动变量中。这些变量在函数 return 上被销毁,因此除非您递归调用自己,否则您不会积累大量内存。你不应该关心 intint* 的大小之间的差异,除非你有很多这样的东西。如有疑问,请在发现问题时分析并更改代码。

由于过度简化的风险和着眼于切实可行的实施,

之间通常没有性能或内存差异
void func1(int *i)
void func2(int i)

编译器将实现前者类似

PUSHAL I(SP)
CALL   func1

后者像

PUSHL I(SP)
CALL func2

对于原子值,根本不会有太大区别。改为

struct somestruct 
{
   char buffer [20000] ;
}  ;

那样的话

void func3(somestruct *i)

可能比

快得多

void func3 (somestruct i)

因为要复制的数据量要大得多。