• Delphi中关于PChar、Char数组、string[](ShortString)及结构体长度及占用空间的一些特性说明和测试


    关于特性


    1,string和Char数组都是一块内存, 其中存放连续的字符. string保存具体字符的内存对用户
    是透明的, 由Delphi管理它的分配, 复制和释放, 用户不能干预
    2,关于ShortString,内存中用第一个字节来表示字符串的长度。FF=255,所以这个特性决定了包括的字符串长度不能大于255。
    3,PChar就是纯指向字符串(#0字符结尾)的指针,与C语言中的char *是一样的,PChar是一个指针, 它的大小只有32位
    4,Char数组也是指向字符串的指针,它与PChar的区别在于:
        1.char数组(均指非动态数组)一旦定义好,它的长度就固定了;
        2.char数组的地址是常量,不能另赋其它值,不能象pchar一样,
        3.其实char数组就相当于const char *

    关于操作速度


    至于 哪个占用内存小, Char数组<PChar(指分配过字符串的)<string(除了具体字符串外
    还 包含字符串长度)
    如果空字符串那么PChar<String<array [0..n] of Char
    从速度来说毫无疑问string最慢,要说速度最快当然是纯指针操作的pchar与char数组最快啦
    所谓占内存最少,效率最高

    使用场景注意事项

    所以,在Delphi结构体中,要使用或传输字符串,首选的是Char数组,如果一定要使用string,也要指定长度。比如string[20]这样。如果超过255则必须使用Char数组.
    因为在结构体中如果直接使用string会有意想不到的惊喜等着你。比如:这里不采用定长的方式,那么当采用SizeOf()获取结构的大小的时候,可能得不到正确的大小值。
    另外这个首位成员变量的值,很有可能出现随机值的情况,就是你已经给它赋了值,在当前的显示是正确的,但是.....自己去慢慢体会

    下面是一个简单的测试
     

    1. program Unit1;
    2. {$APPTYPE CONSOLE}
    3. uses
    4. SysUtils,
    5. Classes,IniFiles;
    6. type
    7. TStruct=packed record
    8. arr: array[0..50] of Char;
    9. str: string[50];
    10. end;
    11. var
    12. arr: array[0..50] of Char;
    13. str: string[50];
    14. s:string;
    15. //sl:TStringList;
    16. sl:THashedStringList;
    17. index:Integer;
    18. s1,s2:string;
    19. st:TStruct;
    20. begin
    21. begin
    22. s:='Hello';
    23. WriteLn(Format('arr长度:%d, sizeof arr: %d str长度:%d,sizeof str:%d',[Length(arr),SizeOf(arr),Length(str),SizeOf(str)]));
    24. StrPCopy(arr, s);
    25. str:=s;
    26. WriteLn(Format('arr长度:%d, sizeof arr: %d str长度:%d,sizeof str:%d',[Length(arr),SizeOf(arr),Length(str),SizeOf(str)]));
    27. WriteLn(arr);
    28. WriteLn(Format('sizeof st: %d',[SizeOf(st)]));
    29. StrPCopy(st.arr, s);
    30. st.str:=s;
    31. WriteLn(Format('sizeof st: %d',[SizeOf(st)]));
    32. sl:=THashedStringList.Create;
    33. sl.CaseSensitive:=True; //标记是否区分大小写
    34. sl.Add('WH445306');
    35. index:=sl.IndexOf('wh445306');
    36. if index<>-1 then
    37. sl.Add('IndexOf不区分大小写')
    38. else
    39. sl.Add('IndexOf区分大小写');
    40. WriteLn(sl.Text);
    41. s1:='WH445306';
    42. s2:='wh445306';
    43. if s1=s2 then
    44. WriteLn('字符比较不区分大小写')
    45. else
    46. WriteLn('字符比较区分大小写');
    47. sl.Free;
    48. Readln; //等待键盘输入
    49. end;
    50. end.

    运行效果:

    印证了上面说的内容。 

  • 相关阅读:
    Java - 工具类参数初始化
    亚马逊买家号白号批量注册怎么做?
    【Linux】权限管理
    改进花朵授粉算法的无线传感器网络部署优化(Matlab代码实现)
    Droplet——一款轻量的Golang应用层框架
    删除字符串中的*
    QT 系统学习 day03 了解各种控件,文件操作,消息框,windows应用界面的 生成菜单栏, 状态栏,中心部件,工具栏,
    【SQL学习进阶】从入门到高级应用【万字事务详解】
    基于一种交互式的光伏组件特性曲线算法(Matlab代码实现)
    cdh3.6.2集成flink1.12.0
  • 原文地址:https://blog.csdn.net/wh445306/article/details/127895598