C/C++:[11]自动存储、静态存储和动态存储
1、在函数内部定义的常规变量称为自动变量,使用自动存储空间。
即这些变量在函数被调用时自动生成,在函数调用结束后自动消亡。
2、自动变量是一个局部变量,其作用域为包含它的代码块(指被花括号括起来的一段代码)。
3、自动变量通常存储在栈中。
在代码块执行时,其中包含的自动变量将依次加入到栈中,而代码块执行完后,则将按照相反的顺序释放这些变量。
注:栈是一种存储结构,其特性是后进先出(Last In First Out,LIFO)。
4、自动存储变量示例:
int fuc(void)
{
int time = 0;
return 0;
}
则上面的int型变量time因为在函数fuc内部声明而使用自动存储。
1、顾名思义,静态存储是在整个程序执行期间都存在的存储方式。
2、使变量称为静态存储有两种方式:
1、将变量声明放在函数外部;
2、在函数内部使用static关键字声明变量。
3、方式1示例:
int time = 0;
int main()
{
return 0;
}
上面的int型变量time为静态存储。
4、方式2示例:
int fuc(void)
{
static int time1 = 0;
return 0;
}
则上面的int型局部变量time1因为有static修饰而使用静态存储。
1、动态存储比自动变量和静态变量更灵活。
C++使用new和delete关键字来声明和销毁动态变量。
2、new和delete管理一个内存池,在C++中称为自由存储空间(free store)或堆(heap)。
该内存池和用于存储自动变量和静态变量的内存是分开的。
3、C++允许程序员在一个函数中使用new分配内存,而在另一个函数中释放它。
因此数据的生命周期完全不受函数的生存时间控制。
4、与使用常规变量相比,使用new和delete让程序员对程序如何使用内存有了更大的控制权。不过同时也使内存管理变得复杂,因为在栈中,自动添加和自动删除机制使得占用的内存总是连续的,但使用new和delete可能使占用的自由存储空间不连续,这使得追踪新分配的内存位置更加困难。