gpt4 book ai didi

c++ - C++中函数的内存分配

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

我还是个 C++ 新手。刚读到类的静态成员函数不是特定于对象的 - 所有对象的成员函数都有一个拷贝。

现在我想到了两个问题:

  1. “仅在内存分配方面”的普通函数和静态函数有什么区别?

  2. 如果成员函数包含一些局部变量怎么办?在这种情况下,函数“应该”有一个单独的变量拷贝——特定于调用该函数的对象……这个问题在 C++ 中是如何解决的?

谢谢!

最佳答案

What is the difference between anordinary function and a staticfunction "in terms of memoryallocation only" ?

没有。除了范围之外,静态函数就像全局函数一样。

即使对于非静态成员函数,也不需要额外的内存。成员函数 int C::f(int arg1, int arg2) 只是类似 int C__f(C* this, int arg1, int arg2) 的语法糖。

What if the member function containssome local variables ? In that casethe function "should" have a separatecopy of that variable - specific tothe object invoking the function...

函数的每次调用 都有局部变量的拷贝(除非它们是静态)。这就是递归在 C++ 中成为可能的原因。

How is this problem solved in C++ ?

函数调用基于“栈帧”。栈帧包括:

  • 函数的参数(如果适用,包括隐式的 this)。
  • 函数中的任何其他非static 局部变量。
  • “返回地址”,它告诉处理器在函数完成后从哪里恢复执行。

每当调用一个函数时,都会创建一个栈帧。当函数返回时,栈帧被销毁。如果函数被递归调用,递归的每一层都有自己的栈帧。例如,如果您有

int factorial(int n) {
if (n <= 1)
return 1;
else
return factorial(n - 1) * n;
}

然后当您调用 factorial(3) 时,会像这样创建一个堆栈帧:

------------------------ stack pointer (SP)
n = 3
RA = <in main()>

当对 factorial(2) 进行递归调用时,一个额外的帧被添加到堆栈的顶部

------------------------ SP
n = 2
RA = <in factorial()>
------------------------
n = 3
RA = <in main()>

factorial(1) 进行另一个递归调用。

------------------------ SP
n = 1
RA = <in factorial()>
------------------------
n = 2
RA = <in factorial()>
------------------------
n = 3
RA = <in main()>

这是递归的基本情况,返回值 1 存储在寄存器中。函数调用完成,顶层栈帧被销毁,并在保存的返回地址处继续执行。

------------------------ SP
n = 2
RA = <in factorial()>
------------------------
n = 3
RA = <in main()>

现在,对 factorial(2) 的调用可以计算其返回值 (2),并且可以销毁另一个堆栈帧:

------------------------ SP
n = 3
RA = <in main()>

最后,我们可以计算原始函数调用 (6) 的结果,并销毁这个栈帧。

关于c++ - C++中函数的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3403280/

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