【C++】C言語のconstキーワードとC++言語の解析② (const定数はメモリタイミングを確保 | const定数はコンパイル時にメモリを確保)





1. const定数メモリ確保のタイミング



前回のブログでは、const 定数のアドレスの取得について説明しました。コードは次のとおりです。

    // 定义常量
    // 该常量定义在了 符号表 中
    // 符号表 不在内存四区中 , 是另外一种机制
    const int a = 10;

    // 定义一个指针
    int* p = NULL;
    // 将 常量 a 的地址赋值给指针
    // 在 堆内存中重新 分配一个 4 字节的空间 
    // 将 常量 a 的值 10 存储进去
    p = (int *)&a;

すべてのプログラミング言語において、定数には次の特性があります。メモリは定義時に割り当てられ、動作中は変更されません。

const 定数は通常、プログラムの実行中に値が変化しない変数を指します。定数は定義された後にメモリが割り当てられます。このプロセスは通常、コンパイラのコンパイル段階で発生します。

C++ プログラムは最初にコンパイルされてから実行されます。コンパイル時にメモリが割り当てられるということは、プログラムの実行前にプログラム メモリ内の定数の位置が固定されることを意味します。

const 定数値は、メモリが割り当てられた後は変更できないため、のような定数を使用して固定値を表すことができます。π、自然数eee ;


const 定数にメモリを割り当てる時間は、コンパイル中にコンパイラによって割り当てられます。

ポインタ p は、const 変数のアドレスを取得すると、ヒープ メモリ内のポインタのメモリ アドレスを割り当てます。このメモリ割り当てのタイミングは、コンパイラによるコードのコンパイル中に行われます (メモリは、コンパイラによるコードのコンパイル中に割り当てられません)。ランタイム)





2. 次のコードを使用して、const 定数メモリの割り当てのタイミングを検証します。



次のコードを使用して確認します。

// 包含 C++ 头文件
//#include "iostream"

// 使用 std 标准命名空间
//		该命名空间中 , 定义了很多标准定义
//using namespace std;

#include <stdio.h>

int main()
{
    
    
    // 定义普通变量
    int a = 0;

    // 定义常量
    // 该常量定义在了 符号表 中
    // 符号表 不在内存四区中 , 是另外一种机制
    const int b = 10;

    // 定义普通变量
    int c = 0;
	
    // 打印上述三个常量/变量 的 地址
    printf("&a = %p , &b = %p , &c = %p\n", &a, &b, &c);

	// 控制台暂停 , 按任意键继续向后执行
	//system("pause");
    return 0;
}

の結果:

&a = 00B3F894 , &b = 00B3F888 , &c = 00B3F87C

D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Debug\HelloWorld.exe (进程 21584)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

ここに画像の説明を挿入





3. 分析と検証の結果 - const 定数はコンパイル時にメモリを割り当てます



上記のコードでは、最初に変数 a が定義され、次に定数 b が定義され、最後に変数 c が定義されます。

変数 a と変数 c は、コンパイラがコンパイルするときにメモリを割り当てる必要があり、コンパイラは変数定義をスキャンしてメモリを割り当てます。

ここで定数 b のアドレスを出力してみます。実行結果は次のようになります。

&a = 00B3F894 , &b = 00B3F888 , &c = 00B3F87C

3 つの間には 12 バイトのメモリの差があり、3 つの変数/定数のメモリは連続しており、メモリが同時に割り当てられていることを示しています。

変数 a と c はコンパイル時にコンパイラによって割り当てられるメモリで、これら 3 つのメモリは連続しており、メモリ割り当て時間は同じです。これは、定数 b もコンパイラのコンパイル段階で割り当てられることを示しています。


ここで、Visual Studio 2019 開発環境では、int 型は本来 4 バイトを占有しますが、デバッグ モードではデバッグ情報を格納するために前後 4 バイトが割り当てられ、12 バイトを占有することに注意してください。

おすすめ

転載: blog.csdn.net/han1202012/article/details/132415910