【C++】C 언어와 C++ 언어의 const 키워드 분석② (const 상수는 메모리 타이밍 할당 | const 상수는 컴파일 중에 메모리 할당)





1. const 상수 메모리 할당 타이밍



이전 블로그에서 const 상수의 주소를 얻는 방법에 대해 이야기했으며 코드는 다음과 같습니다.

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

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

모든 프로그래밍 언어에서 상수는 다음과 같은 특징을 가지고 있습니다. 메모리는 정의될 때 할당되고 작동 중에 변경되지 않습니다.

const 상수는 일반적으로 프로그램이 실행되는 동안 값이 변경되지 않는 변수를 의미합니다. 상수는 정의된 후 메모리가 할당됩니다. 이 프로세스는 일반적으로 컴파일러의 컴파일 단계에서 발생합니다.

C++ 프로그램은 먼저 컴파일된 후 실행되는데, 컴파일 타임에 메모리를 할당한다는 것은 프로그램이 실행되기 전에 프로그램 메모리에서 상수의 위치가 고정된다는 것을 의미합니다.

메모리가 할당된 후에는 const 상수 값을 수정할 수 없으므로 pi \pi 와 같이 상수를 사용하여 고정 값을 나타낼 수 있습니다.π , 자연수ee전자 ;


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는 컴파일러가 컴파일할 때 할당한 메모리이며, 세 가지 메모리는 연속적이고 메모리 할당 시간이 동일합니다. 이는 컴파일러 컴파일 단계에서도 상수 b가 할당된다는 것을 나타냅니다.


여기서 참고로 Visual Studio 2019 개발 환경에서는 int 유형이 원래 4바이트를 차지하지만, 디버그 디버깅 모드에서는 디버깅 정보를 저장하기 위해 전후에 4바이트가 할당되어 12바이트를 차지합니다.

추천

출처blog.csdn.net/han1202012/article/details/132415910