结论:

到底什么时候用Length,SizeOf呢,我总结下使用Length,Sizeof的场景

1.Length(静态数组或动态数组)----没有问题

2.Length(string/shortstring/ansistring/utf8string) --- 任何string都不能用,以防错误,那么该如何计算一个字符串中字符的个数呢,用我师傅的CharCountA/w/u如下图;

3.SizeOf(静态数组) ---- 返回数组占用的总的字节数如:array[0..5] of Byte ; array[0..5] of integer;

4.SizeOf(动态数组、或任何堆栈式存储方式的东东如:任何ansistring/utf8string/string等) ---- 错误,对于堆栈式存储结构它返回的是栈中指针的内存大小,32位程序的话始终是4;

5.SizeOf(基本数据类型如:Char/Integer/Cardinal/Boolean等不包含String) ----- 可以得到数据类型占用的字节数;

6.SizeOf(无堆栈存储方式的Record)

----------------------------------------------------------------------------------------------------------------------------------------

procedure TForm4.Button1Click(Sender: TObject);
var
a: AnsiString;{本地系统GBK编码}
b: UnicodeString;
c: UTF8String;
d: WideString;{WideString的编码也是Unicode的,与String的区别是没有引用计数,编译器会自动识别处理}
e: string;{UnicodeString}
a1,b1,c1,d1,e1: TBytes;
begin
a := 'a好';//好---2个字节
b := 'a好';//好---2个字节
c := 'a好';//好---3个字节
d := 'a好';//好---2个字节
e := 'a好';//好---2个字节 //知识点1:首先AnsiString(本地GBK)、UnicodeString、UTF8String、WideString都是兼容ASCII码的
//知识点2:SizeOf 都等于4的原因是, String是栈堆存储的, SizeOf算的是栈中指针的字节数。
//知识点3: Length 返回的是字节数,但是对于Unicode编码的字符串而言(String,UnicodeString,WideString),返回的是字节数除以2
//知识点4:widestring也是unicode编码的.
Memo1.Lines.Clear;
Memo1.Lines.Add('AnsiString:' + sLineBreak + Length(a).ToString + sLineBreak + SizeOf(a).ToString);
Memo1.Lines.Add('UnicodeString:' + sLineBreak + Length(b).ToString + sLineBreak + SizeOf(b).ToString);
Memo1.Lines.Add('UTF8String:' + sLineBreak + Length(c).ToString + sLineBreak + SizeOf(c).ToString);
Memo1.Lines.Add('WideString:' + sLineBreak + Length(d).ToString + sLineBreak + SizeOf(d).ToString);
Memo1.Lines.Add('string:' + sLineBreak + Length(e).ToString + sLineBreak + SizeOf(e).ToString); //让我们看看堆中的数据到底有几个字节数以及如何存储的
a1 := TEncoding.ANSI.GetBytes(a);
b1 := TEncoding.Unicode.GetBytes(b);
c1 := TEncoding.UTF8.GetBytes(c);
d1 := TEncoding.Unicode.GetBytes(d);
e1 := TEncoding.Unicode.GetBytes(e);
end; procedure TForm4.Button2Click(Sender: TObject);
var
//a: AnsiString[10];报错,不能这样定义
//b: UnicodeString[10];报错,不能这样定义
//c: UTF8String[10];报错,不能这样定义
//d: WideString[10];报错,不能这样定义
a: string[];
b: ShortString;{相当于 String[255]}
a1,b1: TBytes;
begin
a := 'a好';
b := 'a好'; //知识点1:对于定长字符串也是堆栈的方式存储的
//知识点2:string的下标是从1开始的,所以string[10] 就是 1..10个元素,那么为什么SizeOf等于11呢,因为定长字符串会多出一个首字节来记忆字符串的实际长度
//知识点3: 虽然定长字符串也是堆栈方式存储的,但是SizeOf返回的结果与变长字符串不同,返回的是实际占用的字节数.
Memo1.Lines.Clear;
Memo1.Lines.Add('string[10]:' + sLineBreak + Length(a).ToString + sLineBreak + SizeOf(a).ToString);
Memo1.Lines.Add('ShortString:' + sLineBreak + Length(b).ToString + sLineBreak + SizeOf(b).ToString); //让我们看看堆中的数据到底有几个字节数以及如何存储的
a1 := TEncoding.Unicode.GetBytes(a);
b1 := TEncoding.Unicode.GetBytes(b);
end; procedure TForm4.Button3Click(Sender: TObject);
var
a: array[..] of Byte;
b: TBytes;
begin
//构造动态数组
b := WideBytesOf('abc您好'); //知识点1:静态数组是仅仅栈内存储的,而动态数组是堆栈方式存储的
//知识点2:观察SizeOf的结果你会发现,SizeOf对应静态数组而言返回的就是占用的字节数,对于动态数组而言返回的是指针占用的字节数
Memo1.Lines.Clear;
Memo1.Lines.Add('静态数组:' + sLineBreak + Length(a).ToString + sLineBreak + SizeOf(a).ToString);
Memo1.Lines.Add('动态数组:' + sLineBreak + Length(b).ToString + sLineBreak + SizeOf(b).ToString); end;

type
r1 = record
age: Integer;
sex: Boolean;
year: Word;
end; r2 = record
name: string;
age: Integer;
sex: Boolean;
year: Word;
end; procedure TForm4.Button4Click(Sender: TObject);
var
a: r1;
b: r2;
begin
a.age := ;
a.sex := True;
b.name := 'xiaoli'; //知识点1:含有堆栈存储的结构不能用SizeOf来去字节的大小;比如name是指针
//知识点2:这里牵涉到字节对齐的问题,具体可以百度,没有必要知道这个是编译器的事。
Memo1.Lines.Clear;
Memo1.Lines.Add('不含堆栈结构:' + SizeOf(r1).ToString); //8
Memo1.Lines.Add('含堆栈结构:' + SizeOf(r2).ToString);//8 + 4 = 12 不可用于SizeOf
end;

关于SizeOf、Length的更多相关文章

  1. 蚁群算法求解旅行商问题(附c和matlab源代码)

    前几天写了个模拟退火算法的程序,然后又陆陆续续看了很多群智能算法,发现很多旅行商问题都采用蚁群算法来求解,于是开始写蚁群算法的模板.网上关于蚁群算法的理论很多就不再这里赘述了,下面直接上代码和进行简单 ...

  2. POJ-3421 X-factor Chains---求因子+递推 或 素因子+组合数学

    题目链接: https://vjudge.net/problem/POJ-3421 题目大意: 给你一个数X,将X分解成1~X的因子数列,前一个数可以整数后一个数,求满足条件的最大链长以及有多少条这样 ...

  3. Java与C之间的socket通信

    最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少 ...

  4. 【bfs】拯救少林神棍(poj1011)

    Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...

  5. HDU 4707 Pet 邻接表实现

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4707 解题报告:题目大意是在无向图G中有n个点,分别从0 到n-1编号,然后在这些点之间有n-1条边, ...

  6. Kuangbin带你飞 AC自动机

    模板: struct Ac_Automation { int ch[MAXNNODE][SIGMA_SIZE]; int val[MAXNNODE]; int fail[MAXNNODE],last[ ...

  7. opencl(九)----标量、向量数据类型

    1.opencl 标量数据类型 bool char unsigned char/uchar short 16位有符号整数(补码) ushort int 32位有符号整数(补码) uint 32位无符号 ...

  8. 《Pro AngularJS》学习小结-02

    上一篇的项目只有一个单独的模板页面,加入了相应的controller,filter,使得页面上的数据能够动态的变化.现在我们开始建立并整合多个模板,加入购物车模块和结账checkout模块. 一.在页 ...

  9. delphi 判断一个数组的长度用 Length 还是 SizeOf ?

    判断一个数组的长度用 Length 还是 SizeOf ?最近发现一些代码, 甚至有一些专家代码, 在遍历数组时所用的数组长度竟然是 SizeOf(arr); 这不合适! 如果是一维数组.且元素大小是 ...

  10. c++ sizeof,strlen, length

    #include <map>#include <iostream>#include <algorithm>#include <functional>#i ...

随机推荐

  1. 解题:POI 2011 Dynamite

    题面 从零开始的DP学习系列之叁 树形DP的基本(常见?)思路:先递归进儿子,然后边回溯边决策,设状态时常设$dp[x]$表示以$x$为根的子树中(具体分析算不算$x$这个点)的情况 显然的二分答案, ...

  2. oracle 视图views

    SELECT * FROM DBA_VIEWS WHERE VIEW_NAME='你的视图名'; SELECT * FROM USER_VIEWS WHERE VIEW_NAME='你的视图名'; S ...

  3. D. Dog Show 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest, qualification stage (Online Mirror, ACM-ICPC Rules, Teams Preferred)

    http://codeforces.com/contest/847/problem/D 巧妙的贪心 仔细琢磨... 像凸包里的处理 #include <cstdio> #include & ...

  4. 【Asp.net入门3-02】使用jQuery-jQuery 入门

    下面的几小节将介绍jQuery的基础知识.如前所述,不可能仅仅通过一章的内容详细介绍jQuery, 但可以向你说明如何对HTML文档中的内容执行简单的操作,以及更重要的,如何逐步实现本书其他 部分的示 ...

  5. R语言颜色综合运用与色彩方案共享

    R语言颜色综合运用与色彩方案共享 小魔方 EasyCharts 2016-11-21 今天这篇主要讲解R语言颜色综合运用,主要跟大家介绍如何提取那些专业色彩包中的颜色搭配用于在基础绘图系统和高级绘图系 ...

  6. linux基础命令之sed

    什么是sed? sed是一个流编辑器,英文全名为stream editor,流的意思就是能处理文件或者通过管    道传输来的数据.主要针对行,也就是行编辑.默认是不编辑文件的,处理时,把当前    ...

  7. Kubernetes 1.5集成heapster

    Heapster是kubernetes集群监控工具.在1.2的时候,kubernetes的监控需要在node节点上运行cAdvisor作为agent收集本机和容器的资源数据,包括cpu.内存.网络.文 ...

  8. P4514 上帝造题的七分钟

    P4514 上帝造题的七分钟 题意: 二维区间修改 区间查询 --- 错误日志: 写了个 4 重循环忘记调用 \(i\) Solution 二维树状数组 巨尼玛毒瘤 听说二维线段树会 \(MLE\) ...

  9. Hadoop生态圈-使用MapReduce处理HBase数据

    Hadoop生态圈-使用MapReduce处理HBase数据 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对HBase表中数据进行单词统计(TableInputFormat) ...

  10. 解析Job,bpmn文件的小项目总结

    1.在使用String类中split(String regex)切割字符串abcd.job遇得到job字符串时,直接使用split("."),导致数组超出界限错误 原因:得到的数组 ...