美文网首页
3.c++内存简介

3.c++内存简介

作者: celusing | 来源:发表于2020-11-26 00:38 被阅读0次

    https://blog.csdn.net/czy47/article/details/90737468
    https://blog.csdn.net/cherrydreamsover/article/details/81627855

    一.内存管理

    深度截图_选择区域_20201120094259.png
    1. 栈:
      由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。

    2. new分配的内存块,由程序控制其释放时机,一般一个new对应一个delete。如果程序没有释放,在程序结束后,操作系统会自动回收。
    3. 全局区/静态存储区
      全局变量和静态变量被分在同一块内存中,存放全局变量、静态变量。程序结束后,由系统释放。
      c++不再区分:已初始化全局区(data)和未初始化全局区(bss)。他们共同占有同一块内存区。
    4. 常量存储区
      存放常量字符串,这是一块比较特殊的存储区,里面存放的是常量,不允许修改。
    5. 自由存储区
      malloc分配的内存块,和堆十分相似。不过使用free来结束自己的生命。
    6. 代码区
      存放函数体(类成员函数和全局区)的二进制代码。

    二.静态全局变量、全局变量、静态局部变量、局部变量的区别

    1. 全局变量、静态全局变量
      全局变量之前加上static,就变成静态全局变量。区别:
    • 全局变量属于常量区,静态全局变量自然也属于常量区;
    • 非静态全局变量的作用域:整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的;而静态全局变量则限制其作用域,即只在定义该变量的源文件内有效,统一源程序的其他源文件中不能使用它。
    • 由于静态全局变量的作用域,局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。
    1. 局部变量、静态局部变量
    • 静态局部变量是属于常量区,而函数内部的局部变量是属于栈区;
    • 静态局部变量的销毁时机是程序结束,但是别的函数调用不了该变量,局部变量随该函数结束而结束。
    • 如果定义这两个变量时没有初始值时,静态局部变量会自动初始化位0,而局部变量是一个随机值。
    • 静态局部变量再编译期间只赋值一次,以后每次函数调用时,都不再赋值。局部变量再调用期间,每调用一次,赋值一次。

    3.普通函数、静态函数

    • static函数和普通函数的作用域不同。static函数的作用域仅在本文件,只在当前源文件中使用的函数应该声明位内部函数(static),内部函数应该再当前源文件中说明和定义。
    • 对于可在当前源文件外使用的其他函数,应该在一个头文件中声明。要使用这些函数的源文件包含这个头文件。

    总结:
    局部变量改成静态局部变量后,改变了其存储方式。即改变了其声明周期;把全局变量改成静态全局变量,改变了其作用域,限制了其使用范围。

    • static全局变量和普通全局变量的区别:static全局变量只初始化一次,防止再其他文件单元中被引用。
    • static局部变量和普通变量的区别:static局部变量只被初始化一次,下一次依据上一次的结果值。
    • static函数和普通函数的区别:static函数在内存中只有一份,普通函数再每个被调用中维持一份复制品。

    相关文章

      网友评论

          本文标题:3.c++内存简介

          本文链接:https://www.haomeiwen.com/subject/ysxdiktx.html