当我们编写C++程序时,系统会默认给程序分配内存,这些内存被分为五个不同的区域,每个区域用途不同,下面我们来详细介绍一下这五个区域的作用。
代码区(文字常量区)
代码区主要用来存放程序的执行代码,这部分内存是只读的,并且在程序启动时就已经固定分配好了。在一个C++程序中,所有的函数、语句都被转换成了二进制码,并被存储在代码区中。代码区还包括存储在程序中的字符串常量,如常量字符串 “Hello, world!”就是存储在代码区中的。
示例:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char* str = "Hello World!";
cout << str << endl;
return 0;
}
在上面的代码中,我们定义了一个字符指针类型的变量 str,它指向字符串常量 “Hello World!” 。由于字符串常量存储在代码区中,str 指向的是只读的内存区域,无法修改。但可以通过这个指针来读取这个字符串。
全局(静态)区
全局区又叫作静态区,它用来存储全局变量、静态变量以及常量,它在程序启动时就已经被分配好了空间,直到程序结束才被释放。
在C++程序中,所有在函数外定义的变量都被存储在全局区中。当然,你可以通过 static 关键字在函数内部定义静态变量,这些静态变量也会存储在全局区中。
示例:
#include<iostream>
using namespace std;
int global = 10; //全局变量
void fun(){
static int static_var = 20; //静态变量
cout<<"global in fun:"<<global<<endl;
cout<<"static_var in fun:"<<static_var<<endl;
}
int main(){
int local = 30; //局部变量
fun();
cout<<"global in main:"<<global<<endl;
return 0;
}
在上述代码中,变量 global 在函数外定义,存储在全局区;变量 static_var 在函数内使用 static 关键字定义,也存储在全局区。函数 fun() 被调用时,它能够访问全局区中的变量,输出变量 global 和 static_var 的值。
栈区
栈区是存放程序中局部变量和函数参数的内存区域,栈区内存的分配方式是先进后出,所以也叫作后进先出栈。在程序执行过程中,每次函数调用都会把函数的参数、返回地址以及函数内部的局部变量等信息压入栈中。
示例:
#include<iostream>
using namespace std;
int add(int x, int y)
{
int z = x + y;
return z;
}
int main()
{
int a = 10, b = 20, c;
c = add(a, b);
cout << "a + b = " << c << endl;
return 0;
}
在上面的代码中,变量 a、b、c 都是存储在栈区中的局部变量,函数 add() 中的参数、变量 z 也是存储在栈区中。每次函数调用时,都会分配一些内存空间来存储函数内部的变量。
堆区
堆区也叫动态内存分配区,它是由程序员自己分配和释放的一块内存区域。当程序需要在运行时动态分配一块内存来存储某些数据时,就需要使用堆区。
示例:
#include<iostream>
using namespace std;
int main()
{
int *p;
p = new int; //分配一个整型变量大小的内存
*p = 10; //给分配的内存赋值
cout << *p << endl; //输出值
delete p; //释放分配的内存
return 0;
}
在上面的示例中,我们使用 new 操作符分配了一个整型变量大小的内存空间,然后使用指针变量 p 来保存分配的内存地址。我们可以使用 *p 来存取这一块内存,最后通过 delete 操作符释放内存。
常量区
常量区是专门存储常量的一块内存区域。常量区中的数据在程序运行期间是不能被修改的,通常包括程序中定义的只读变量和常量等。
示例:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
const char *str = "I love coding!";
cout << str << endl;
return 0;
}
在上述代码中,我们使用 const 关键字将一个字符指针指向一个字符串常量,这个字符串常量存储在常量区,只能读取,无法修改。
以上是五个不同的内存分区,需要注意的是,栈和堆是动态分配存储空间的区域,需要程序员自己负责管理。同时,也应该明确区分五个不同的内存分区的作用,以便编写正确的程序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++程序的五大内存分区实例详解 - Python技术站