为什么在Delphi里面,全局变量可以在声明的时候同时初始化,但是局部变量却不行?
当然,这个语言本身所定义的.
但我想知道为什么要这样设计语言?它的好处在哪里?

解决方案 »

  1.   

    这应该是语言设计者的风格问题,就像为什么要用begin...end,而不用{...}一样
    没有什么特别的原因
      

  2.   

    楼上的基本上都说了.全局变量分配在堆(其实应该是应用程序自己维护的全局变量区),局部变量分配在栈.
    当你编译成功后,全局变量就已经在内存里分配好了,所以可以进行他的初始化工作.
    而局部变量则不是这样.
    所有的方法,第一句话都是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里做更多的事情,这显然是不可取的.
    试想一下,如果要完成局部变量的初始化,每次进入方法体,都要把栈里的数据清零.
    为什么要定义局部变量,因为他都是我们在方法要使用的临时变量,结果不需要保存.所以,完全没有必要花费系统开销去做这个没有太大意义的事情.
    我的一点点愚见,望各位大侠指出不足之处.
      

  3.   

    这应该是语言风格问题,C++也是在栈上分配局部变量,
    它允许int i = 0这种分配以后初始化
    可pascal就是不允许,
    很难说明哪种风格更好
      

  4.   

    int i = 0
    这是你手动完成的初始化工作
      

  5.   

    语言风格问题。pascal是一种比较严格的语言