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が含まれていると考えられる.