dephi变量初始化的一点疑惑 为什么在Delphi里面,全局变量可以在声明的时候同时初始化,但是局部变量却不行?当然,这个语言本身所定义的.但我想知道为什么要这样设计语言?它的好处在哪里? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这应该是语言设计者的风格问题,就像为什么要用begin...end,而不用{...}一样没有什么特别的原因 楼上的基本上都说了.全局变量分配在堆(其实应该是应用程序自己维护的全局变量区),局部变量分配在栈.当你编译成功后,全局变量就已经在内存里分配好了,所以可以进行他的初始化工作.而局部变量则不是这样.所有的方法,第一句话都是begin(不讨论直接使用汇编asm作为开始).begin做的事情其实就是push ebp // 保存栈底mov ebp, esp // 将当前栈顶赋给ebp, 用ebp作为当前函数段的栈顶sub bsp, X // 在栈上分配内存, X的值一般为局部变量(一般会包含Result)的个数 * 4.// 结合上面两句,其实就是在方法内部虚拟了一块栈内存然后对局部变量的操作都成了类似下面的操作mov [ebp - $04], eax // 在register调用约定中, eax存放的是第一个形参(如果是成员方法,该值就是Self)// 把eax的的值传给第一个局部变量(不足4byte的按4byte对齐)mov edx, [ebp - $08] // 将第二个局部变量的值传给edx而end;做的事则一般是:mov esp, ebppop ebpret// 很明显他在做的事情就是恢复现场.因为,从上面的分析,可以得出,因为局部变量分配内存是要依据esp与ebp的话,也就是说,无法在程序加载时分配内存.而如果要完成数据初始化,则需要额外的系统开销,则需要在begin里做更多的事情,这显然是不可取的.试想一下,如果要完成局部变量的初始化,每次进入方法体,都要把栈里的数据清零.为什么要定义局部变量,因为他都是我们在方法要使用的临时变量,结果不需要保存.所以,完全没有必要花费系统开销去做这个没有太大意义的事情.我的一点点愚见,望各位大侠指出不足之处. 这应该是语言风格问题,C++也是在栈上分配局部变量,它允许int i = 0这种分配以后初始化可pascal就是不允许,很难说明哪种风格更好 int i = 0这是你手动完成的初始化工作 语言风格问题。pascal是一种比较严格的语言 fcdbtreeview的问题 TDBGridE这个是那个组件里面的控件呀? uses的问题 那有pascal object基础的书,请建议一本。多谢。 在DELPHI 7中怎样设计具有WINDOWS XP主题风格的组建? [公告]请大家举报恶意送分贴、倒分贴 如何取得本地机器的机器名和IP地址?谢谢了。 请问我应该如何做呢? DanHint这个控件怎么安装?只给了一个.pas和一个.dcr文件 这个板块没人了吗?刚刚学DELPHI。 DELPHI 调用当前日期 求助,做了一个返回值是结构体的函数,如何将结果返送会去?
没有什么特别的原因
当你编译成功后,全局变量就已经在内存里分配好了,所以可以进行他的初始化工作.
而局部变量则不是这样.
所有的方法,第一句话都是begin(不讨论直接使用汇编asm作为开始).
begin做的事情其实就是
push ebp // 保存栈底
mov ebp, esp // 将当前栈顶赋给ebp, 用ebp作为当前函数段的栈顶
sub bsp, X // 在栈上分配内存, X的值一般为局部变量(一般会包含Result)的个数 * 4.
// 结合上面两句,其实就是在方法内部虚拟了一块栈内存然后对局部变量的操作都成了类似下面的操作
mov [ebp - $04], eax
// 在register调用约定中, eax存放的是第一个形参(如果是成员方法,该值就是Self)
// 把eax的的值传给第一个局部变量(不足4byte的按4byte对齐)mov edx, [ebp - $08] // 将第二个局部变量的值传给edx而end;做的事则一般是:
mov esp, ebp
pop ebp
ret
// 很明显他在做的事情就是恢复现场.
因为,从上面的分析,可以得出,因为局部变量分配内存是要依据esp与ebp的话,也就是说,无法在程序加载时分配内存.
而如果要完成数据初始化,则需要额外的系统开销,则需要在begin里做更多的事情,这显然是不可取的.
试想一下,如果要完成局部变量的初始化,每次进入方法体,都要把栈里的数据清零.
为什么要定义局部变量,因为他都是我们在方法要使用的临时变量,结果不需要保存.所以,完全没有必要花费系统开销去做这个没有太大意义的事情.
我的一点点愚见,望各位大侠指出不足之处.
它允许int i = 0这种分配以后初始化
可pascal就是不允许,
很难说明哪种风格更好
这是你手动完成的初始化工作