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

标签 c memory-management

我正在尝试理解 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 个字节供其使用,在函数返回时将被释放。

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

关于c - 按值管理函数参数与引用内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29502830/

相关文章:

C++,为什么在修改新分配的对象后会出现访问冲突?

c - 读取较大的 .bmp 文件时出现段错误

我可以比较函数指针和函数是否相等吗?

c - 数组中的下标超出范围

计算数组元素的总和

c - 探索虚拟内存 (ProcessWalker)

c++ - Qt 堆碎片 - QObjects 可以放在内存池中吗?

c - 指针和字符

c - 在 wait(&status) 系统调用的各种情况下状态变量会发生什么变化?

c++ - 如何确定 cv::Mat 使用的是内部数据还是外部数据?