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

news2025/1/12 5:53:01

关于特性


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()获取结构的大小的时候,可能得不到正确的大小值。
另外这个首位成员变量的值,很有可能出现随机值的情况,就是你已经给它赋了值,在当前的显示是正确的,但是.....自己去慢慢体会

下面是一个简单的测试
 

program Unit1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Classes,IniFiles;


type
  TStruct=packed record
    arr: array[0..50] of Char;
    str: string[50];
  end;

  var
    arr: array[0..50] of Char;
    str: string[50];
    s:string;
    //sl:TStringList;
    sl:THashedStringList;
    index:Integer;
    s1,s2:string;
    st:TStruct;

begin

  begin
    s:='Hello';
    WriteLn(Format('arr长度:%d, sizeof arr: %d str长度:%d,sizeof str:%d',[Length(arr),SizeOf(arr),Length(str),SizeOf(str)]));
    StrPCopy(arr, s);
    str:=s;
    WriteLn(Format('arr长度:%d, sizeof arr: %d str长度:%d,sizeof str:%d',[Length(arr),SizeOf(arr),Length(str),SizeOf(str)]));
    WriteLn(arr);

    WriteLn(Format('sizeof st: %d',[SizeOf(st)]));
    StrPCopy(st.arr, s);
    st.str:=s;

    WriteLn(Format('sizeof st: %d',[SizeOf(st)]));


    sl:=THashedStringList.Create;
    sl.CaseSensitive:=True;   //标记是否区分大小写
    sl.Add('WH445306');
    index:=sl.IndexOf('wh445306');
    if index<>-1   then
      sl.Add('IndexOf不区分大小写')
    else
      sl.Add('IndexOf区分大小写');
    WriteLn(sl.Text);
    s1:='WH445306';
    s2:='wh445306';
    if s1=s2 then
      WriteLn('字符比较不区分大小写')
    else
      WriteLn('字符比较区分大小写');
    sl.Free;
    Readln;  //等待键盘输入
  end;

end.

运行效果:

印证了上面说的内容。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】MySQL复制与高可用水平扩展架构实战(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

天王刘德华走红毯,到哪他都是最耀眼的明星

第三十五届金鸡奖&#xff0c;已经在福建厦门落下帷幕&#xff0c;如果要说本届金鸡奖谁收获最大&#xff0c;无疑是天王刘德华。在金鸡奖颁奖典礼现场&#xff0c;功夫巨星吴京登上热搜&#xff0c;然而热搜的主角却不是他&#xff0c;而是天王刘德华。 在本届金鸡奖颁奖典礼现…

cubeIDE开发, stm32调试信息串口通信输出显示

关于cubeIDE开发基本技巧及流程&#xff0c;本文不详细叙述&#xff0c;请参考&#xff1a;cubeIDE快速开发流程_py_free的博客-CSDN博客_cubeide汉化 一、stm32串口配置 本文采用的开发板是stm32L496VGT3,其有两个 USB 接口&#xff0c;一个为 USB ST-link 复用接口&#xff…

代码随想录——最长递增子序列的个数

题目 给定一个未排序的整数数组&#xff0c;找到最长递增子序列的个数。 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列&#xff0c;分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。 示例 2: 输入: [2,2,2,2,2] 输出: 5 解释: 最长递增子序列的长度是1&#xff0c;并且…

Oracle 表创建和表管理

1.表的命名 必须以字母开头字符长度在1-30之间只能包含A-Z&#xff0c;a-z,0-9,_,$和#被同一个用户拥有的对象不能有重复的名字 2.表的创建 SQL> create table t01(id number(4),name varchar2(15));Table created.SQL> desc t01Name …

现场直击!维视智造携多款明星产品亮相VisionChina 2022深圳机器视觉展

11月15日&#xff0c;2022年中国&#xff08;深圳&#xff09;机器视觉展在深圳国际会展中心&#xff08;宝安新馆&#xff09;盛大开幕&#xff0c;维视智造携MV-CR读码相机、3D线激光相机、VisionBank AI多相机智能视觉系统等多款行业领先产品及解决方案亮相。 1 ►现场速击 …

C基础--内存对齐问题(结构体对齐)

问题现象 在调试一个软件功能时&#xff0c;发现一个结构体对齐的问题&#xff0c;以前没有太关注&#xff0c;现在把它总结出来。先看示例&#xff1a; 结构体1&#xff1a; typedef struct {char magic[4];uint32_t crc32;uint32_t lenght;uint16_t ver;uint16_t IFrameCnt…

多线程DPDK应用的内存优化

作者 Conor Walsh is a software engineering intern with the Architecture Team of Intel’s Network Platform Group (NPG), based in Intel Shannon (Ireland). 引言 高速包处理是一种资源密集型应用。一种解决方案是将包处理流水线(pipeline)分离到多线程以提高程序性能…

大一新生HTML期末作业,网页制作作业——海鲜餐饮网站登录页面(单页面)HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

STM32G0开发笔记-Platformio+libopencm3-FreeRTOS和FreeModbus库使用

title: STM32G0开发笔记-Platformiolibopencm3-FreeRTOS和FreeModbus库使用 tags: STM32MCUSTM32G070libopencm3MonkeyPiFreeRTOSModbus categories: STM32 date: 2022-9-11 19:52:05 [原文&#xff1a;makerinchina.cn] 使用Platformio平台的libopencm3开发框架来开发STM32…

docker -- 入门篇 (数据卷、自定义镜像、安装mysql redis)

1 数据卷 采用上一章节创建的centos镜像启动容器 doc01 docker run -it --name doc01 lhy/centos:1.00 2 数据卷容器 启动子容器doc02 实现继承doc01的关系 docker run -it --name doc02 --volumes-from doc01 lhy/centos:1.00 启动子容器doc03 实现继承doc01的关系 docker…

【计算机毕业设计】病人跟踪治疗信息管理系统源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 病人跟踪治疗信息管理系统采用B/S模式&#xff0c;促进了病人跟踪治疗信息管理系统的安全、快捷、高效的发展。传统的管理模式还处于手工处理阶段&#xff0c;管理效率极低&#xff0c;随着病人的不断增多&a…

mac pro M1(ARM)安装:安装zookeeper可视化工具PrettyZoo、ZooKeeperAssistant

0. 引言 今天安装zookeeper的可视化工具遇到一些问题&#xff0c;将其记录下来&#xff0c;以供后续的同学参考&#xff0c;在mac软件安装上少走弯路。同时也让大家体会下这两款不同的zk可视化工具的差别 1. 安装PrettyZoo 1、下载 直接在github上选择版本下载&#xff1a; …

8 - 复习总结java中的继承与多态

1. 继承 1.1 为什么需要继承 先看一个例子: 比如猫和狗都是动物&#xff0c;都可以用一个类来描述。 使用java语言来描述&#xff1a; class Cat{String name;int age;float wight;public void bark(){System.out.println(name"汪汪汪叫");}public void eat(){S…

PyTorch使用快速梯度符号攻击(FGSM)实现对抗性样本生成(附源码和数据集MNIST手写数字)

需要源码和数据集请点赞关注收藏后评论区留言或者私信~~~ 一、威胁模型 对抗性机器学习&#xff0c;意思是在训练的模型中添加细微的扰动最后会导致模型性能的巨大差异&#xff0c;接下来我们通过一个图像分类器上的示例来进行讲解&#xff0c;具体的说&#xff0c;会使用第一…

Reactor 模型

文章目录1、网络编程关注的事件2、网络 IO 的职责2.1、IO 检测2.1.1、连接建立2.1.2、连接断开2.1.3、消息到达2.1.4、消息发送2.2、IO 操作2.2.1、连接建立2.2.2、连接断开2.2.3、连接到达2.2.4、消息发送3、Reactor 模式3.1、概念3.2、面试&#xff1a;Reactor 为什么使用非阻…

利用jenkins直接构件docker镜像并发布

一、本服务器构建 1.jenkins安装完成之后&#xff0c;打jenkins&#xff0c;选择新建任务&#xff0c;如&#xff1a; 2.进行〔源码管理〕配置&#xff0c;如&#xff1a; 3.构建执行配置&#xff0c;如&#xff1a; APP_NAMEtest-project APP_PORT8083 RUN_ENVprod cd /var/…

EtherCAT与RTEX驱动器轴回零的配置与实现

上节课程&#xff0c;正运动小助手给大家分享了运动控制器提供的回零模式配置与实现。本节课程主要介绍控制器实现EtherCAT与RTEX驱动器的回零及其配置。 01 总线驱动器回零模式 正运动控制器提供自己的回零模式&#xff0c;也支持使用EtherCAT总线驱动器提供的回零模式&…

学长教你学C-day9-C语言循环结构与选择结构

小刘最近在读《老子》&#xff0c;被道家“一生二&#xff0c;二生三”的哲学思想迷住了&#xff0c;他不禁想代码是谁生的呢&#xff1f;首先代码就是一堆字符&#xff0c;字符不是代码&#xff0c;就像“白马非马”&#xff0c;但是当字符按照一定的顺序组织起来时&#xff0…

《Python编程无师自通》读书笔记

不能越界访问函数内部定义的变量 global不能乱用 啥时候用元组 join连接 小点&#xff0c;但第一次见会觉得蛮有意思。 Hangman 10.1的案例蛮有意思的 一搜才发现是十分经典的文字游戏 过程式编程的缺点以及函数式编程和面向对象编程的解决方法 过程式编程的缺点 函数式编程…