• static总结


    【本文链接】

    http://www.cnblogs.com/hellogiser/p/static.html

    【分析】

    【内存分配方式】

    在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

    栈stack,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

    堆heap,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

    自由存储区free storage,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

    全局/静态存储区 global/static storage,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

    常量存储区 storage,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

    【static修饰变量】

    static 是C++中很常用的修饰符,它被用来控制变量的存储方式(生命期)和作用域。

    变量可以分为:global变量、static global变量、static local变量和local变量。

    (1) 按存储区域分:global,static global,static local都存放在内存的global/static存储区域,局部变量存放在内存的stack。

    (2) 按作用域分:global变量在整个工程文件内都有效;static global变量只在定义它的文件内有效;static local变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;local变量在定义它的函数内有效,但是函数返回后失效。

    (3)是否具有初值:全局变量和静态变量如果没有手工初始化,则由编译器初始化为0,局部变量的值不可知。

    global变量本身就是静态存储方式,static global变量当然也是静态存储方式。这两者在存储方式上并无不同,这两者的区别虽在于global变量的作用域是整个源程序,当一个源程序由多个源文件组成时,global变量在各个源文件中都是有效的。 而static global变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于static global变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

    从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是。

    local===>static local改变了它的存储方式(生命期)

    global===>static global改变了它的作用域, 限制了它的使用范围

    【static修饰函数】

    global函数===>static global函数将其作用域限制在本源文件之内,对其它源文件不可见。而global函数具有全局可见性,对其它源文件则可见。static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

    此处static的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

     定义静态函数的好处: 静态函数不能被其它文件所用; 其它文件中可以定义相同名字的函数,不会发生冲突;

     【static修饰类成员变量】

     static修饰类成员变量属于class所有,在程序中也只有一份拷贝,由该类型的所有对象共享访问。

     【static修饰类成员函数】

    static成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。

    【参考】

    http://www.studytonight.com/cpp/static-keyword.php

    http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html

    http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/08/2542315.html

    http://www.cnblogs.com/SelaSelah/archive/2012/04/09/2438651.html

    http://blog.csdn.net/zhanghefu/article/details/5003407

    个人学习笔记,欢迎拍砖!---by hellogiser

    Author: hellogiser
    Warning: 本文版权归作者和博客园共有,欢迎转载,但请保留此段声明,且在文章页面明显位置给出原文连接。Thanks!
    Me: 如果觉得本文对你有帮助的话,那么【推荐】给大家吧,希望今后能够为大家带来更好的技术文章!敬请【关注】
  • 相关阅读:
    使用netcraft在线查看网站使用的操作系统和服务器
    Terracotta Web Sessions Tutorial
    JPA2.0和Spring的集成配置方式
    Maven笔记(5) Eclipse和Maven集成
    Maven笔记(2) 常用命令和标准的Maven项目结构
    Maven笔记(4) 构建一个Web Project
    Linux 技巧:让进程在后台可靠运行的几种方法
    You are currently running the HMaster without HDFS append support enabled. This may result in data loss. Please see the
    xtrabackup 安装及应用
    CentOS 6.2 X64上64位Oracle11gR2 静默安装,静默设置监听,静默建库亲自实践记录
  • 原文地址:https://www.cnblogs.com/hellogiser/p/static.html
Copyright © 2020-2023  润新知