Call Stack
#include <iostream>
int main() {
int a;
double b;
return 0;
}
前述したスタックは変数aが堆積した後にbが堆積する.実際のスタックメモリは変数でスタックされません.
スタックフレームごとにメモリを蓄積します.
これらのスタックフレームに蓄積される単位はfunction call単位である.
#include <iostream>
void foo() {
int a;
int b;
}
void bar() {
Cat cat;
Dog dog;
}
int main() {
int a;
double b;
foo();
bar();
return 0;
}
このようにすると、最初のmain関数が実行されるにつれて、int a、double bのスタックフレームワークが作成されます.foo関数のスタックフレームが上に移動します.
foo関数が終了すると、foo関数のスタックフレームワークが消えます.
bar関数のスタックフレームは上昇し,bar関数が終了するとbar関数スタックフレームは消失する.
最後にmain関数のスタックフレームワークが消えます.
stack frameには他の情報が含まれています.
パラメータとreturn address情報.
引数がfoo(10)の10で、
return addressは、関数呼び出しの終了時に次のコマンドを実行します.
以下のコマンドを含むアドレスを保存します.
classがスタックフレームとしてどのように表現されるか
class Cat {
public:
Cat() {
m_age = 1;
};
~Cat();
void addAge(int arg) {
m_age += arg;
};
private:
int m_age;
}l
int main() {
Cat cat;
cat.addAge(10);
return 0;
}
まずmain関数のスタックフレームを生成し,Catクラスのint m ageに4 bバイトを与える.
次にCat()ジェネレータのスタックフレームを作成し,主関数スタックフレームのm age=1を初期化する.
その後、Cat()ジェネレータにアドレスを格納し、main関数フレームワークメモリにアクセスします.
その後、スタックフレームがfreeに変わります.
addAgent()関数を実行すると、returnアドバイザaddressとarg in 10が保存されます.
main関数のCatクラスメモリを指します.
addAgent関数を実行する場合は、パラメータ10を使用してCatクラスメモリにアクセスし、m age+=10を実行します.
~Cat()が実行され、Catクラスが解放され、プログラムが終了する.
これは.
スタックフレームを積み重ねてmember変数を制御します.
内部にはmember変数を指すaddressが含まれていると考えられる.
Reference
この問題について(Call Stack), 我々は、より多くの情報をここで見つけました https://velog.io/@dik654/Call-Stackテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol