您的位置 首页 发布

labview深化探究——全局变量、局部变量与内存办理

很多教科书上都提示要慎用局部变量和全局变量,主要有以下几个原因:违背了数据流的编程读取局部变量需要拷贝数据不能象SUBVI一样可以重用

许多教科书上都提示要慎用局部变量全局变量,主要有以下几个原因:

违反了数据流的编程
读取局部变量需求仿制数据
不能象SUBVI相同能够重用数据BUFFER
不利于程序调试
简单引起竞赛

我在论坛上看到许多初学者的程序,里边充满了许多的局部变量,能够这样说,当你运用了过多的局部变量的时分,你的程序结构是有问题的,在前期的LV版别中底子不存在全局变量和局部变量,相同能够编制规划很大的程序,这说明局部变量和全局变量并不是有必要的,LV供给了它们是因为在特定的情况下能够简化编程。

当咱们运用SUBVI时,咱们需求界说一个连接器,包含输入输出端子,调用VI的数据从输入端子进入,当SUBVI未履行结束时,数据是不会流出到输出端子的,因而,SUBVI能够重用调用VI的数据缓冲区。而局部变量能够在子VI的任何方位被读写,局部变量在同一一个VI中,全局变量能够在任何VI中,所以通常情况下,无法重用数据缓冲区。

局部变量用于读写一个VI的前面板目标,目标是控制器或许指示器都能够,当咱们读局部变量的时分,咱们是在目标的当时状况,而目标在程序框图中的其它方位,其它的线程或许接连写这个目标,所以LABVIEW无法重用内存,不得不仿制数据到新的缓冲区中,假如数据结构很大,就会占用相当多的内存。

许多情况下,局部变量都是能够防止的,看下面的比如。

上面图中的规划办法,在许多初学的程序中常常碰到,相同的数据要传到两个VI中,并且有次第要求,因而选用了次序结构。问题是底子没有必要用局部变量,局部变量导致了数据的仿制。

上面的两个图完结相同的功用,一个依然选用次序结构,不过CLUSTER挪到了FRAME外面,经过地道,将数据传入到两个子VI中,防止了运用局部变量。可是次序结构自身也是功率比较低的,也是NI不主张过度运用的.

针对这个具体问题,最下面的是最好地解决方案,运用过错簇作为数据流完成了次序处理,防止运用局部变量。经过过错簇一起也有利于程序调试盯梢.别的一个显着的长处是程序框图更明晰明晰,防止了在各个FRAME中进行切换.

全局变量运用内存的办法类似于局部变量,不同的是每次读全局变量肯定要生成一份内存仿制,而局部变量是有或许重用缓冲区的.当全局变量是一个比较大的数组或许字符串时,多处屡次读操作会形成许多的内存仿制,极大地占用内存,导致运转速度下降。

从运用办法的视点看,全局变量很向一个SUBVI(8。X后SUBVI也有了运用权限的问题,如私有,公有),能够被任何其它VI调用,可是有一个底子的不同,当一个SUBVI正在被其他VI调用的时分,别的一个VI假如也在调用这个SUBVI,它有必要等候这个SUBVI履行完结后,(设置可重入的在外),因而,虽然LABVIEW是并行的,多线程的,可是具体到这个SUBVI,却是有次序的,需求控制权的,因而,LABVIEW很简单对SUBVI进行缓存重用。

所以,对全局变量,特别是针对数组或许字符串,虽然它能够直接被调用,最好也要封装成一个SUBVI来运用,这样能够极大进步内存运用功率,一起防止了竞赛的问题。

在循环中调用全局变量特别要注意,每次多全局变量的时分,LV有必要先仿制这个数据,看下面的比如

上面的两个图中,黑色的需求重复调用内存办理器1000次,产生1000次内存仿制,而下面的只需求一次内存仿制。

假如COUNTER是一个巨大的数组,程序的运转功率会有惊人的不同。

假如用SUBVI封装全局变量,不如直接用FUNCTION GLOBAL,我在其他的文章中具体介绍过。

局部变量和全局变量别的一个问题是数据竞赛的问题。以为任何时刻,该全局变量或许局部变量都能够被读写,这个问题在其它语言中也存在,所以要选用临界或许互斥的办法来防止。

封装成SUBVI,对调用者来说,就完成了相互排挤,任何时刻,只能有一个调用者运用这个SUBVI。

关于编程者来说,有许多办法能够防止全局变量。

运用FUNCTION GLOBAL(也叫LV2型全局变量)
运用行列或许布告
运用用户事情结构
运用控件参阅

已然说了全局变量有各式各样的问题,但不是说全局变量是毫无用途的,我用全局变量最多的是用它来界说常量。

C语言中,能够用DEFINE来界说常量。
#define pi 3.14159

同理,咱们能够把常量都放在同一个GLOBAL文件中。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/211428.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部