hur.cn - 华软网

 热门搜索

来,来,来,大家共同讨论一个问题!

  作者:未知    来源:网络    更新时间:2017/9/26
讨论思想的源于这么一个情况:一个函数直接保存到pbl中(也就是全局函数),若将该函数保存到一个对象中,然后呢?将这个对象定义成一个全局变量!

讨论:pb对这个两种情况,在内存的分配上如何进行的?
本人是这样考虑的:该应用程序一旦运行,肯定会将所有的全局变量全部载入内存等待系统随时调用,
但肯定不会将全局函数载入内存,这些全局函数应该是在需要用到时才会被载入内存的!
如果我上面的判断是对的话,那么请讨论,pb载入带有函数的全局对象,在内存的分配上又是如何进行的,是仅存入一些该对象的某些参数(比如对象的的接口地址什么呀......),还是将该对象中一些变量、函数全部载入内容?如果是,那么还可以进一步讨论,函数又是如何被载入内容去等待运行的呢?
即具体载入些什么内容?

分不多,但我希望等待大家好消息,积极参与下,如果有关很底层PB理论资料,还望大家不吝啬共享才行!
------华软网友回答------
这个嘛,没研究过
------华软网友回复------
关注。我认为全局函数应该是在需要用到时才会被载入内存的,就象pbd文件一样
------华软网友回复------
來者,請頂一下?
------华软网友回复------
no know
------华软网友回复------
应该都是载入内存,只不过,对象在实例化的时候再分配地址,


调用的时候从再从堆栈把指针指向地址运行
------华软网友回复------
你可写个全局函数,运行,查看内存使用,运行到该函数的时候,内存基本没什么变化,反而会减少,
可证明不是用到时才调用
------华软网友回复------
pb不是解释执行的吗,所以我认为是用到的再去处理比较合理阿(用我的方法试试,在某个pbl里定义一个全局函数,然后编译,然后执行时别把这个pbd放到执行目录下,跑和这个pbl内容无关的部分,程序肯定不报错,这不是说明了随用随调吗)?呵呵!!!
------华软网友回复------
那也只能说明该函数没有执行罢了,只要声明了就一定有内存空间分配(俗称抢占地盘),调用即执行时再分配一定的内存(试验过,一函数运行增长8K),我又继续试验,连续调用该函数,内存没再增长,即说明已经有该函数的地址占用的内存,只是指针指向该地址重复执行

"抢占地盘"的例子最明显的就是微软的sql server,对内存的“占有欲”非常强,可以说紧紧拽着不放,也正是它一旦系统负荷大点,立刻崩溃的主要原因
--------------------------------------------------------------------
还翻了翻我以前收藏的资料:


PBD创建库文件的方式简称伪代码(PCODE),伪代码PB编译对象时生成的一种中间代码,运行时PB虚拟机(一组DLL组成)解释并执行中间代码伪代码,方式与JAVA十分相似,都编译成字节代码并由虚拟机/虚拟引擎执行,编译成DLL的代码格式的称为机器代码,对机器代码来说,PB生成真正的二进制文件,PB运行时库DLL根据需要装入二进制文件,这种方式与其他的机器代码应用程序的执行方式完全相同。

主要区别在于,伪代码在执行代码前有个解释过程而机器代码则直接执行,pcode与PB应用程序结合得更好,可以使应用程序运行 更加稳定

两种方式是运行机制的不同,但相同之处都有字节载入映射,只要你的代码不是注释代码,就会有内存空间的一席之地



------华软网友回复------
这个问题,首先要从pb的全局函数的原理说起。
如果你研究过全pb的局函数,你就会发现,他实际上是一个类。
也就是说,你建一个全局函数,跟建一个带一个函数的nvo实际上是没什么区别的。

你肯定会说,他们使用的时候完全不同,怎么会一样?
这就涉及到pb中的一个自动实例化的概念。
非自动实例化很好理解,就像我们平时写的一样。例如实例化一个nvo如下:
nvo_1 lnvo_1
lnvo_1 = create lnvo_1

自动实例化的意思就是一个对象不用显示的调用create语句.全局函数就是一个自动实例化的类,在调用全局函数时,pb虚拟机首先还是要把全局函数类实例化,然后调用其中的方法。
例如:
gf_add()
当调用gf_add()的时候,实际上pb虚拟机会首先实例化一个gf_add的对象,然后再调用其中的gf_add()方法。然后再销毁掉gf_add类。

上面简单说明了pb全局函数的原理,有了这个原理,我想,楼主的问题就可以解释了吧?
------华软网友回复------
呵呵,在下真的十分感激!



告诉大家,我提这个问题是由于以下这个原因:
我看见许多人喜欢将全局函数写在pbl中,而有些人喜欢将全局函数写在用户对象中,然后呢?就将用户对象定义成全局变量!
显然,后者便于归类管理,而且有些函数需要API调用,也好编写一些!如果像我上面所说的,将之放在对象中定义成全局函数,若程序一运行就进驻内存的话,那么随着时间的推移,以后的函数定义越多,系统资源消耗的就会越多,虽然问题不大,经验告诉我,许多系统开发都是由于这些细小的问题在开发之前没得到应有的考虑,所以日后就积累出大量的问题,最终导致项目实施的失败?

------华软网友回复------
hygougou(狗狗):---------:>人真好,呵呵!回答这么多!
to davidtc(我說兩句):
你这理论的意思是:pb在自动化一个对象时,系统分配的资源,跟其内部定义的变量和函数的量无关,是吗?也就是说,当应用程序要用到该对象的某个内部变量,或相关函数时,pb就才会为止分配一定的资源!
如果这一个理论对头,那将函数全部写到用户对象中就太好不过了,一来,便于管理归类(比如替函数命名,我们就不需要加什么前缀之类的罗嗦东西,这个前缀就可以直接加在对象名上体现其功能位置等等),二来,便于今后代码的移植(若今后其他系统也要用到此函数库,显然,移动一个对象要灵活的多,是吧)!

------华软网友回复------
hygougou(狗狗) 是个好同志!!!!!!!!!!!!!1
------华软网友回复------
对象和函数是不同的,全局函数会分配内存,不管调用不调用,对象则是创建时才分配内存的,
个人认为
------华软网友回复------
最后顶一次!

嘿,上去!
------华软网友回复------
区别在于,全局函数不可销毁释放内存,
而对象可以,


所以用在对象上的函数更能有益于内存的分配,换句话说,尽量用全局声明的全局函数
------华软网友回复------
难得一见的讨论贴!热闹呀:)
------华软网友回复------
呵呵,lzheng2001发表一下呀

笔误改为:尽量少用全局声明的全局函数
------华软网友回复------
对于一个大的系统来说,当然是把函数写在一个全局的对象里比较好,pfc就是这样做的 :)
------华软网友回复------
对头
------华软网友回复------
:)
------华软网友回复------
还有人up没,要揭贴了!
------华软网友回复------
讨论贴应该有个结论,方便大家学习      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。