关于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 ...
随机推荐
- 解题:POI 2012 Well
题面 比较明显地能看出二分来,但是检查函数很难写.对于二分出的一个$mid$,我们要让它满足在$m$次操作内令序列中存在一个为零的位置,同时使得任意相邻的两项之差不超过$mid$ 第二项的检查比较好做 ...
- c++ 容器弊端
1.stack 不能直接清空,要 while (!s.empty()) s.pop(); 2.vector 增添.删除数据,也许vector首尾的地址会发生改变 如: ( watch f.begin( ...
- lumen 使用 dingo API 在 phpunit 中 404 的解决方法, 以及鉴权问题
1. phpunit.xml 中添加 dingo 相关配置 <env name="API_STANDARDS_TREE" value="x"/> & ...
- bzoj 1503
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 12311 Solved: 4399[Submit][Stat ...
- P2015 二叉苹果树
P2015 二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接 ...
- Hadoop生态圈-phoenix的视图(view)管理
Hadoop生态圈-phoenix的视图(view)管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- vue 隐藏滚动条
element-ui隐藏组件scrollbar: <el-scrollbar style="height:100%"> </el-scrollbar> 真正 ...
- 线程中wait/notify/notifyAll的用法
前言 多线程时,最关注的就是线程同步,线程间的同步一般用锁来实现,常见的锁就是synchronized和lock.用了synchronized,就不得不提到wait/notify/notifyAll. ...
- ajax状态码--转他人的
var getXmlHttpRequest = function () { try{ //主流浏览器提供了XMLHttpRequest对象 return new XMLHttpRequest(); } ...
- HDU 5928 DP 凸包graham
给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...