为什么在Delphi里面,全局变量可以在声明的时候同时初始化,但是局部变量却不行?
当然,这个语言本身所定义的.
但我想知道为什么要这样设计语言?它的好处在哪里?
当然,这个语言本身所定义的.
但我想知道为什么要这样设计语言?它的好处在哪里?
解决方案 »
- 关于导出excel表的问题
- 如何复制一个一样的form,包括里面所有的代码。
- 如何解决win98下delphi7+access计算数据慢的原因!急!急!急!
- 如何在windows"开始-程序"菜单中添加和删除菜单项?高分送!
- 怎么样压缩图片?急...
- ■■■发布一个免费的小软件,用MSN的朋友注意一下了!!■■■
- 编写用ODBC连接SQL2000为什么每次启动都要输入密码,如何能够在代码中预先输入?
- 请教,delphi程序中调用ZPL指令,如何调整CODE128A条形码的变窄
- 请教各位大侠帮忙!!!在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就是不允许,
很难说明哪种风格更好
这是你手动完成的初始化工作