全局变量 对于程序员来说,是程序 “同步”的一种最方便的 方式,我相信大多数的程序员 刚开始都是使用全局变量来实现“同步”操作的,但是随着我们 编程理念的升华,我们会发现,原来全局变量不是我们想象的只有好用,而没有缺点。

优点:

1)全局可见,任何 一个函数或线程都可以读写全局变量-同步操作简单。

2)内存地址固定,读写效率比较高。

缺点:

1)全局变量存放在静态存储区,系统需要为其分配内存,一直到程序结束, 才会释放内存,这一点就局部变量的动态分配,随用随从栈中申请,用完(函数调用完毕)就释放。

2)影响函数的封装性能:我们肯定是希望我们写的函数具有重入性,就如一个黑盒子一般,只 通过函数参数就能得到返回,内部 实现要独立,但是如果函数中使用了全局变量,这势必就破坏了函数的封装性,会造成对全局变量的依赖。

3)降低函数的移值性,原因同上。

4)降低代码的可读性,这也意味着系统维护会不方便,因为一个全局变量可能会出现程序中的各个环节,函数的 执行也会根据环境变化而变化,所以调试会不太方便。

5)全局变量的读写,可能会延迟,这主要是体现在“写”操作上,由于写操作,一般需要2个周期操作,所以有可能会出现,这边没写完时,那边已经读了,结果 读到的不是最终值,这个是一个概率事件,概率 很小,但是并不代表没有。

小结:上面的说的缺点,可能有些人会觉得有些矫情,或者概率很小, 这个要分情况讨论的,如果对于一个非常简单的程序来说,代码量少, 功能也少,那全局变量无疑是最适合的同步方式。但是对于代码量大,功能有 多,逻辑又复杂的系统来讲,“稳定”来源于方方面面,其中就需要严谨和方便维护,所以不适用全局变量能够大大的避免出bug, 方便后期维护,这个时候就需要考虑下,尽量少用全局变量,替代全局变量的方式有很多,最简单易用的就是信号量或者消息队列。这个在裸机程序里也很好实现,而在 操作系统中,就更方便了,因为一般操作系统 都会提供信号量功能,可以直接使用。

全局变量的优缺点及为什么要少用全局变量相关推荐

  1. C语言为什么要尽量少用全局变量

    在程序链接时,链接器只关心函数和全局变量,链接器把它们识别为符号,来进行链接.注意,高级语言中的函数重载仅仅是语法糖,本质是不同的函数 强符号:函数和已初始化的全局变量 弱符号:未初始化的全局变量 不 ...

  2. python全局变量在整个程序内都有效_Python 全局变量使用

    在平时的开发中我们有时候会用到全局变量,但是很多开发语言不允许使用或者建议少使用全局变量,Python也是如此.但是有时候为了编写程序的方便和灵活,必须使用全局变量.这篇文章记录是我在使用Python ...

  3. python全局变量定义_Python 3 实现定义跨模块的全局变量和使用

    尽管某些书籍上总是说避免使用全局变量,但是在实际的需求不断变化中,往往定义一个全局变量是最可靠的方法,但是又必须要避免变量名覆盖. Python 中 global 关键字可以定义一个变量为全局变量,但 ...

  4. python中全局变量的定义及调用_python中定义全局变量

    python中怎么定义全局变量 python中在哪些情况下必须使用global来声明全局变量 python class里面的全局变量问题 python中的本地变量(local variable)和全局 ...

  5. php中全局变量如何设置,如何在php中声明全局变量?

    我有这样的代码: $a="localhost"; function body(){ global $a; echo $a; } function head(){ global $a ...

  6. c 全局变量多线程调用_c语言局部变量 静态局部变量 全局变量与静态全局变量...

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

  7. c 多文件全局变量_C语言开发单片机为啥都是全局变量形式?

    01 前言 全局变量简直就是嵌入式系统的戈兰高地.冲突最激烈的双方是:1. 做控制的工程师:2. 做非嵌入式的软件工程师. C语言.单片机.嵌入式相关资料,可以加我微信"dqjob12345 ...

  8. mysql全局变量 error_记录——node-mysql连接池遇到的全局变量问题

    记录一个折腾了快2个小时的BUG,目前还不清楚原理. 系统分别在阿里云(测试用).XL服务器上部署,此次BUG所在功能模块为生成表格并下载,表格数据由120(阿里云)上的数据库提供. 阿里云上一切正常 ...

  9. php全局变量的关键字,php的static关键字和全局变量

    1.全局变量[其不属于面向对象的思想,因为其放在对象之外的],面向对象有一个特点,其实封装的,php希望其所有的成员都应该放在类中:php的面向对象是基于面向对象的,不是纯粹面向对象的:也就是其可以面 ...

最新文章

  1. oracle更改密码机制,Oracle密码机制以及常用操作
  2. 腾讯杰出科学家写给2029的信:计算机视觉AI技术的爆点在哪里?
  3. html5行级标签,8、html5哪些标签时块级、行内、行内块?2021-01-30
  4. python(numpy,pandas8)——pandas大范围赋值和增加特定数据,处理丢失数据(nan)
  5. python核心编程-第六章-个人笔记(二)
  6. 【玩转开源】BananaPi R2——移植RPi.GPIO 到 R2
  7. CUDNN下载速度慢解决方法
  8. linux 文件名 序列号,在Linux中应如何查看系统硬件制造商、型号和序列号
  9. 求教务排课系统(eclipes和MSQL)!
  10. Java字符串查找第一个不重复字符_java如何实现获取字符串中第一个出现不重复的字符...
  11. 弹簧管压力表设计报告
  12. 戴尔N5110装WIN10的体验
  13. led同步回显到计算机屏幕,手把手教您如何将笔记本电脑的画面投屏到LED大屏幕上显示,音视频同步传输...
  14. 个人计算机键盘上的按键击键声音小,按键盘每个键出现嘟嘟的声音也打不出字是什么...
  15. u盘插上显示计算机限制,U盘插到电脑上不显示图标的解决方法(以金士顿8GU盘为例)...
  16. The Beatles - Don't bother me 歌词翻译
  17. 用计算机打字方法,电脑快速打字方法
  18. 详解磁盘配额的设置方法
  19. 关于ffmpeg内存管理函数av_malloc和av_free/av_freep
  20. svn提交怎么全选_SVN 一次性提交多个目录中文件

热门文章

  1. 案例分享:建设企业网上办公综合平台
  2. linux系统怎么设置为中午_Linux修改系统时间与时区
  3. react中render重绘时,constructor是否执行问题
  4. 智能硬件蓝牙配网方案概要
  5. 哲学家进餐问题(java模拟死锁及解决方案)
  6. Linux 状态命令之 sar
  7. 国产x86服务器芯片,华为、飞腾扛旗,国产服务器芯片有望突破!ARM要替代x86?...
  8. 使用ES6,Pt更好JavaScript。 III:酷收藏和闪烁的弦
  9. 3D激光雷达SLAM算法学习02——3D激光雷达传感器
  10. IntelliJ IDEA设置编码格式