2021-01-26クロックインしてC ++を学習する6日目


1つは、メモリパーティションモデルです。

C ++プログラムが実行されると、メモリは一般的に次のように分割されます。4つのエリア

  • コード領域:オペレーティングシステムによって管理される関数本体のバイナリコードを格納します

  • グローバル領域:グローバル変数と静的変数および定数を格納します

  • スタック領域:コンパイラによって自動的に割り当てられて解放され、関数パラメータ値、ローカル変数などが格納されます。

  • ヒープ領域:プログラマーによって割り当てられて解放されます。プログラマーが解放しない場合、オペレーティングシステムはプログラムの最後にそれを再利用します。

== 4つのメモリ領域の意味:==異なる領域に格納されたデータは、異なるライフサイクルを提供し、プログラミングの柔軟性を高めます。

1.プログラムが実行される前

プログラムのコンパイル後、exe実行可能プログラムが生成されます。このプログラムは、プログラムが実行される前に2つの領域に分割されます。

コード領域:

  • CPUによって実行されるマシン命令を格納します

  • コード領域は共有はい、共有の目的は、頻繁に実行されるプログラムの場合、メモリ内にコードのコピーを用意するだけでよいということです。

  • コード領域は読み取り専用はい、読み取り専用にする理由は、プログラムが誤って命令を変更しないようにするためです。

グローバルエリア:

  • グローバル変数静的変数ここに保存

  • グローバルエリアには、一定の面積、文字列定数およびその他の定数もここに格納されます

  • 特徴:この領域のデータは、プログラムの終了後にオペレーティングシステムによってリリースされます

グローバル変数とローカル変数は、メモリ内の異なるメモリ領域に分散されます

グローバル変数は、関数に配置されない変数です

静的変数は、通常の変数の前に静的変数を追加することです

グローバル変数、静的変数、文字列定数、グローバル定数(定数変更されたグローバル定数)はグローバル領域に格納されます

ローカル変数とローカル定数(定数変更されたローカル変数)はグローバル領域にありません

#include<iostream>
using namespace std;

//全局变量
int g_a = 10;
int g_b = 20;

//全局常量
const int c_g_a = 10;
const int c_g_b = 20;

int main()
{
    
    
	//局部变量
	int a = 10;
	int b = 20;
	cout << "局部变量a的存放地址" << (int)&a << endl;
	cout << "局部变量b的存放地址" << (int)&b << endl;

	//局部常量
	const int c_a = 10;
	const int c_b = 20;
	cout << "局部常量c_a的存放地址" << (int)&c_a << endl;
	cout << "局部变量c_b的存放地址" << (int)&c_b << endl;

	//全局变量
	cout << "全局变量g_a的存放地址" << (int)&g_a << endl;
	cout << "全局变量g_b的存放地址" << (int)&g_b << endl;

	//全局常量
	cout << "全局常量c_g_a的存放地址" << (int)&c_g_a << endl;
	cout << "全局常量c_g_b的存放地址" << (int)&c_g_b << endl;



	//静态变量
	static int s_a = 10;
	static int s_b = 20;
	cout << "静态变量s_a的存放地址" << (int)&s_a << endl;
	cout << "静态变量s_b的存放地址" << (int)&s_b << endl;

	//字符串常量
	cout << "字符串常量的存放地址" << (int) &"hello world" << endl;



	system("pause");
	return 0;

}

出力結果
ここに画像の説明を挿入

2.プログラムの実行後

スタック領域:コンパイラによって自動的に割り当てられて解放され、関数パラメータ値、ローカル変数などが格納されます。

(注:ローカル変数のアドレスを返さないでください。スタック領域で開かれたデータは、コンパイラーによって自動的に解放されます)

ローカル変数、正式なパラメータデータスタック領域に格納されているスタック領域のデータは、関数の実行後に自動的に解放されます

ヒープ領域:プログラマーによって割り当てられて解放されます。プログラマーがそれを解放しない場合、オペレーティングシステムはプログラムの終了時にそれを再利用します。

new演算子:
C ++では、newは主に
ヒープ領域のメモリを開くために使用されます。ヒープ領域で開かれたデータは、プログラマーによって作成され、手動で解放され、解放されます。演算子delete
構文を使用します。newnew 数据类型
によって作成されたデータデータポインタに対応するタイプを返します

#include<iostream>
using namespace std;

int *func()
{
    
    
	int * p = new int(10);
	return p;
}

void test01()
{
    
    
	int * p = func();
	cout << *p << endl;
	cout << *p << endl;
	//堆区的数据不会自动释放,需要程序员操作
	//如果想释放堆区的数据,利用关键字delete
	delete p;
}

void test02()
{
    
    
	//在堆区创建整型数据的数组,含有10个元素
	int *arr = new int[10];

	//释放数组
	delete[] arr;
}

int main()
{
    
    
	test01();
	
	system("pause");
	return 0;

}

[注]学習コースは-ダークホースプログラムC ++チュートリアル

おすすめ

転載: blog.csdn.net/qq_42616280/article/details/113193140