C ++:4つの主要なメモリパーティション

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人の新しいオペレーター

C ++:新しい演算子


関連リンク:

https://www.bilibili.com/video/BV1et411b73Z?p=84

おすすめ

転載: blog.csdn.net/weixin_46098577/article/details/122174159