关于SizeOf、Length
结论:
到底什么时候用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的更多相关文章
- 蚁群算法求解旅行商问题(附c和matlab源代码)
前几天写了个模拟退火算法的程序,然后又陆陆续续看了很多群智能算法,发现很多旅行商问题都采用蚁群算法来求解,于是开始写蚁群算法的模板.网上关于蚁群算法的理论很多就不再这里赘述了,下面直接上代码和进行简单 ...
- POJ-3421 X-factor Chains---求因子+递推 或 素因子+组合数学
题目链接: https://vjudge.net/problem/POJ-3421 题目大意: 给你一个数X,将X分解成1~X的因子数列,前一个数可以整数后一个数,求满足条件的最大链长以及有多少条这样 ...
- Java与C之间的socket通信
最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少 ...
- 【bfs】拯救少林神棍(poj1011)
Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...
- HDU 4707 Pet 邻接表实现
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4707 解题报告:题目大意是在无向图G中有n个点,分别从0 到n-1编号,然后在这些点之间有n-1条边, ...
- Kuangbin带你飞 AC自动机
模板: struct Ac_Automation { int ch[MAXNNODE][SIGMA_SIZE]; int val[MAXNNODE]; int fail[MAXNNODE],last[ ...
- opencl(九)----标量、向量数据类型
1.opencl 标量数据类型 bool char unsigned char/uchar short 16位有符号整数(补码) ushort int 32位有符号整数(补码) uint 32位无符号 ...
- 《Pro AngularJS》学习小结-02
上一篇的项目只有一个单独的模板页面,加入了相应的controller,filter,使得页面上的数据能够动态的变化.现在我们开始建立并整合多个模板,加入购物车模块和结账checkout模块. 一.在页 ...
- delphi 判断一个数组的长度用 Length 还是 SizeOf ?
判断一个数组的长度用 Length 还是 SizeOf ?最近发现一些代码, 甚至有一些专家代码, 在遍历数组时所用的数组长度竟然是 SizeOf(arr); 这不合适! 如果是一维数组.且元素大小是 ...
- c++ sizeof,strlen, length
#include <map>#include <iostream>#include <algorithm>#include <functional>#i ...
随机推荐
- Android平台下OpenGL图形编程
ref: Jayway Team Blog中OpenGL ES简明开发教程https://blog.jayway.com/tag/opengl-es/ OpenGL ES 开发教程http://www ...
- .net mvc 一个Action的 HttpGet 和 HttpPost
http://www.cnblogs.com/freeliver54/p/3747836.html 本文转自:http://stackoverflow.com/questions/11767911/m ...
- Android 蓝牙模块基础操作
之前没怎么接触过蓝牙模块,在学习的过程中借鉴了很多前辈的经验.本次主要包含以下功能: 1.检测是否存在蓝牙模块 2.蓝牙的开启与关闭 3.与本机已配对的蓝牙设备 4.本机蓝牙可见性设置 5.扫描周围蓝 ...
- haproxy做TCP层的负载均衡
最新项目中发现,大量游戏玩家访问登录服务器时出现延迟,导致玩家无法登录,愿意可能是登录服务器性能达到极限. 所以目前想通过proxy的方式访问登录服务器集群,避免登录延迟. 1.下载haproxy最新 ...
- Kafka 0.8 Controller设计机制和状态变化
在kafka集群中,其中一个broker server作为中央控制器Control,负责管理分区和副本状态并执行管理着这些分区的重新分配. 下面说明如何通过中央控制器操作分区和副本的状态. 名词解释 ...
- Shell记录-Shell命令(文件查找)
常见解压/压缩命令 tar文件格式解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!) .gz文件格式解压1:g ...
- JAVA-JSP动作
动作元素基本上是预定义的功能.下表列出了可用的JSP动作 - 编号 动作 描述 1 jsp:include 在请求页面时包含一个文件. 2 jsp:useBean 查找或实例化一个JavaBean. ...
- POJ 1741 Tree 求树上路径小于k的点对个数)
POJ 174 ...
- TV 开发相关
1.设置全屏,隐藏虚拟按键 1.activity oncreate中 @Override 2 protected void onCreate (Bundle savedInstanceState) { ...
- [整理]document.execCommand()
http://msdn.microsoft.com/en-us/library/ms533049%28VS.85%29.aspx http://blog.csdn.net/lhrhi/article/ ...