記事ディレクトリ
14つの主要なメモリパーティション
C ++プログラムを実行すると、メモリは一般的な方向で4つの領域に分割されます
- コード領域:オペレーティングシステムによって管理される関数本体のバイナリコードを格納します
- グローバル領域:グローバル変数と静的変数および定数(文字列定数、グローバル定数)を格納します
- スタック領域:コンパイラによって自動的に割り当てられて解放され、関数パラメータ値(仮パラメータ)、ローカル変数、ローカル定数などが格納されます
- ヒープ領域:プログラマーによって割り当てられて解放されます。プログラマーがそれを解放しない場合は、プログラムの最後にオペレーティングシステムによって再利用されます。
24つのメモリ領域の意味
さまざまな領域に保存されたデータにはさまざまなライフサイクルが与えられるため、プログラミングの柔軟性が高まります。
3プログラムを実行する前に
プログラムのコンパイル後、exe実行可能プログラムが生成されます。このプログラムは、プログラムが実行される前に2つの領域に分割されます。
3.1コード領域
CPUによって実行されたマシン命令を格納します
コード領域は共有されます。共有の目的は、頻繁に実行されるプログラムの場合、メモリに必要なコードのコピーは1つだけです。
コード領域は読み取り専用です。読み取り専用にする理由は、プログラムが誤って命令を変更しないようにするためです。
3.2グローバルエリア
グローバル変数と静的変数はここに保存されます。
グローバル領域には、文字列定数と定数で変更されたグローバル定数を格納する定数領域も含まれます。
。この領域のデータは、プログラムの終了後にオペレーティングシステムによって解放されます。
3.3テストコード
#include <iostream>
using namespace std;
//全局变量
int g_a = 10;
int g_b = 10;
//全局常量
const int c_g_a = 10;
const int c_g_b = 10;
int main()
{
//局部变量
int a = 10;
int b = 10;
//打印地址
cout << "\n局部变量a地址为: " << (int)&a << endl;
cout << "局部变量b地址为: " << (int)&b << endl;
cout << "\n全局变量g_a地址为: " << (int)&g_a << endl;
cout << "全局变量g_b地址为: " << (int)&g_b << endl;
//静态变量
static int s_a = 10;
static int s_b = 10;
cout << "\n静态变量s_a地址为: " << (int)&s_a << endl;
cout << "静态变量s_b地址为: " << (int)&s_b << endl;
cout << "\n字符串常量地址为: " << (int)&"hello world" << endl;
cout << "字符串常量地址为: " << (int)&"hello world1" << endl;
cout << "\n全局常量c_g_a地址为: " << (int)&c_g_a << endl;
cout << "全局常量c_g_b地址为: " << (int)&c_g_b << endl;
const int c_l_a = 10;
const int c_l_b = 10;
cout << "\n局部常量c_l_a地址为: " << (int)&c_l_a << endl;
cout << "局部常量c_l_b地址为: " << (int)&c_l_b << endl << endl;
return 0;
}
出力結果:
3.4まとめ
- C ++では、プログラムが実行される前に、グローバル領域とコード領域に分割されます。
- コード領域機能は共有され、読み取り専用です
- グローバル領域には、グローバル変数、静的変数、および定数が格納されます
- 定数領域には、定数で変更されたグローバル定数と文字列定数が格納されます
4プログラム実行後
4.1スタック領域
-
コンパイラによって自動的に割り当てられて解放され、関数のパラメータ値、ローカル変数、ローカル定数などが保存されます。
-
注:ローカル変数のアドレスを返さないでください。スタック領域で開かれたデータはコンパイラによって自動的に解放され、スタック領域のデータは関数の実行後に自動的に解放されるため、返すことはできません。
4.2テストコード(スタック領域)
#include <iostream>
using namespace std;
//返回局部变量的地址的函数
int * func(int b) //形参数据也放在栈区
{
b = 100;
int a = 10;
return &a; //返回局部变量的地址
}
int main()
{
int *p = func(1); // 接受func函数的返回值
cout << *p << endl; //编译器做了保留(仅一次),所以第一次可以打印正确的数字10
cout << *p << endl; //第二次这个数据就不再保留了,会是乱码,因此不要返回局部变量的地址,因为它所在的内存已经被释放了
return 0;
}
出力結果:
10
-858993460
4.3ヒープ領域
-
プログラマーによって割り当てられ、解放されます。プログラマーが解放しない場合は、プログラムの最後にオペレーティングシステムによって再利用されます。
-
C ++では、主にnewを使用してヒープ領域のメモリを開きます。
4.4テストコード(ヒープ領域)
#include <iostream>
using namespace std;
//在堆区开辟内存的函数
int* func()
{
int* a = new int(10); //在堆区开辟一块内存,利用new创建的数据,会返回该数据对应的类型的指针
return a;
}
int main()
{
int *p = func();
cout << *p << endl;
cout << *p << endl; //第二次及以后,依然能够正常输出 *p 的值,直到程序运行结束,在堆区开辟的内存才被系统回收
cout << *p << endl;
cout << *p << endl;
return 0;
}
出力結果:
10
10
10
10
5人の新しいオペレーター
関連リンク: