integer、string、char类型的变量,它们的内存是怎样分配的?
我看一本书上这样说的:变量可以看成两部分,一是变量本身,二是变量的内存占用。
这句话该怎么理解?
比如:
var
s:string;
s:='abcdefg';
是不是说明s本身占4字节的内存空间,也就是sizeof(s),然后其内容却存放在另一块内存区域,占用另一块内存空间?
变量s的地址中存放的内容是'abcdefg'的地址还是'abcdefg'这个字符串?

解决方案 »

  1.   

    string在Delphi中实际上是一个指针,这个指针的值是字符串的首字符地址。(如果是空字符串则指针的值为$0000)具体细节你可以看看Delphi帮助中的"Memory Management”。
      

  2.   

    Integer、Char一般是在栈上面分配的,string则在堆上面。这方面Delphi的帮助文档已经很详细了。另外,变量有两种形式(值类型,引用类型)
    比如:
    var
      m: Integer;
      s: string;
    begin
      m := 2;
      s := 'Hi';
    end;上面的程序中,m变量(值类型)实际上就是一个地址,这个地址存放了m的值。
    而s变量(引用类型)可以看做是一个指针,它也是一个地址,只不过这个地址存放的是另外一个地址(如'Hi')的值。
      

  3.   

    "谷子"是一个变量,
    "谷子"代表lz,
    那么lz这个人占用了资源,
    "谷子"这两个字也占用了资源.
      

  4.   

    这句话出自《Delphi源代码分析》(周爱民):“变量由两部分组成,变量自身和变量的内存占用。”(P13)变量自身的内存占用可以直接用SizeOf取得,如SizeOf(Integer)。变量的内存占用则取决于该变量的类型,比如字符串、指针、动态数组等等。Assert(SizeOf(Integer) = 4);
    Assert(SizeOf(string) = 4);