//在 delphi 新版中, char 已经是双字节了。故应该重新自己写一个函数,取名为 FillByte ,才无歧义。
procedure TForm1.Button2Click(Sender: TObject);
// 功能,将 Buff 数组快速填充为一个值,如 65
const
MaxLen = 1024;
var
Buff: array [0 .. MaxLen] of byte;
p: PByte;
i: integer;
begin
p := @Buff[0]; // 1 . 初学者写法。
for i := 0 to MaxLen do
begin
Buff[i] := 65; // 如果 Buff 是 delphi 的 string 类型
// 则 Buff[i] 会有一个定位元素的函数调用,代码效率降低了。
end; // 2. 进阶者写法,也可以称之为明白人写法。
// 此写法清晰明白地使用了指针,是常用的方法。
// 即使 Buff 为 delphi 的 string 类型,仍然高效。
for i := 0 to MaxLen do
begin
p^ := 65;
inc(p);
end; // 3. 怪异用法,这是语法特性, c 语言中也有这样的写法
// 可以少写代码,省事。效率与方法2相当。
for i := 0 to MaxLen do
p[i] := 65; end; procedure TForm1.Button1Click(Sender: TObject);
// 功能,将 Buff 数组快速填充为某一个值,如 65 (16 进制0x41 )
const
MaxLen = 1024;
var
Buff: array [0 .. MaxLen] of byte;
PB: PByte;
PI: PInt64;
D: int64;
i, Count: integer;
begin
// 方法4,高级用法。
// 充分利用寄存器的长度,一次填充8个 Byte
// 此写法综合评比最优写法。既高效,又灵活跨越各平台。
PB := @Buff[0];
PI := PInt64(PB);
D := $4141414141414141; // Count := (MaxLen + 1) div 8;
for i := 0 to Count - 1 do
begin
PI^ := D;
inc(PI);
end; // 填充剩余的位置
Count := (MaxLen + 1) and $7; // 等同于 MaxLen mod $7;
PB := PByte(PI);
for i := 0 to Count - 1 do
begin
PB^ := $41;
inc(PB);
end; end; procedure TForm1.Button3Click(Sender: TObject);
// 功能,将 Buff 数组快速填充为某一个值,如 65 (16 进制 0x41 )
const
MaxLen = 1024;
var
Buff: array [0 .. MaxLen] of byte;
p: pointer;
i, Count: integer;
begin
// 方法5 ,骨灰级写法
// 惊天地,泣鬼神,为了效率,啥也不顾了。
// 此为宇宙中效率最高写法,可惜,跨平台或有困难。
Count := (MaxLen + 1) div 4;
p := @Buff[0];
asm
cld;
mov eax,$41414141; // 因为是32位,所以4个字节
mov ecx,count;
mov edi,p;
rep stosd;
end;
Count := (MaxLen + 1) mod 4;
if Count > 0 then
asm
cld
mov eax,$41;
mov ecx,count;
mov edi,p;
rep stosb;
end;
end;

  

dephi FillChar 的几种写法的更多相关文章

  1. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  2. javascript函数的几种写法集合

    1.常规写法 function fnName(){ console.log("常规写法"); } 2.匿名函数,函数保存到变量里 var myfn = function(){ co ...

  3. php插入式排序的两种写法。

    百度了下插入式排序,百度百科中php版本的插入式排序如下: function insert_sort($arr) { // 将$arr升序排列 $count = count($arr); for ($ ...

  4. ASP.NET MVC中获取URL地址参数的两种写法

    一.url地址传参的第一种写法 1.通过mvc中默认的url地址书写格式:控制器/方法名/参数 2.实例:http://localhost:39270/RequestDemo/Index/88,默认参 ...

  5. java单例模式的几种写法比较

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  6. 链接属性rel=’external’、rel=’nofollow’、rel=’external nofollow’三种写法的区别

    链接属性rel='external'.rel='nofollow'.rel='external nofollow'三种写法的区别   大家应该都知道rel='nofllow'的作用,它是告诉搜索引擎, ...

  7. ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

    ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...

  8. 全面理解Javascript闭包和闭包的几种写法及用途

    好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,主要将闭包的写法.用法和用途.  一.什么 ...

  9. EF架构~linq模拟left join的两种写法,性能差之千里!

    回到目录 对于SQL左外连接我想没什么可说的,left join将左表数据都获出来,右表数据如果在左表中不存在,结果为NULL,而对于LINQ来说,要实现left join的效果,也是可以的,在进行j ...

随机推荐

  1. python/进程线程的总结

    python/进程线程的总结 一.进程和线程的描述: 进程:最小的资源管理单位 线程:最小的执行单位 执行一个进程时就默认执行一个线程(主线程) 进程和线程的工作方式: 串行: 假如共有A.B.C任务 ...

  2. 南京邮电大学java程序设计作业在线编程第一次作业

    王利国的"Java语言程序设计第1次作业(2018)"详细 作业结果详细 总分:100 选择题得分:40  1. Java语言中,基本数据类型一共有( )种. A.16 B.2 C ...

  3. 【阿里聚安全·安全周刊】 全美警局已普遍拥有破解 iPhone 的能力 | 女黑客破解任天堂Switch,称硬件漏洞无法修复

    本周的七个关键词: 破解 iPhone丨 女黑客破解任天堂丨假的身份证 丨 扫黄打非丨华盛顿特区发现手机间谍设备 丨 Telegram被俄罗斯监管机构告上法庭丨价值5万美金的Firefox浏览器漏洞 ...

  4. 解决MySQL在修改列时因为外键依赖出错的问题

    因为 favorite_food 中的 person_id 对 person 表中的 person_id 有外键依赖关系,所以在执行 ALTER TABLE person MODIFY person_ ...

  5. 福利:100G Java全套学习视频免费送了

    嗯 是的 众所周知 java工会自开办以来 一直致力于分享一些 java技术总结 学习方法..等等等 所以 从我做这个公众号以来 我的手机就没有消停过一天 因为 每天都有很多粉丝问我 "您好 ...

  6. ConstraintLayout布局介绍.md

    一.介绍 ConstraintLayout是一个ViewGroup允许您以灵活的方式定位和调整窗口小部件的窗口.从api9开始支持.继承自viewGroup; 二.具体使用 这个控件的具体分类主要有如 ...

  7. web攻击和防御措施

    1.SQL注入:参照下面的链接 http://www.cnblogs.com/chenhaoyu/p/8758888.html 2.跨网站脚本攻击(Cross Site Scripting, XSS) ...

  8. C#扩展方法(转)

    扩展方法使您能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型." 这是msdn上说的,也就是你可以对String,Int,DataRo ...

  9. [LeetCode] Boundary of Binary Tree 二叉树的边界

    Given a binary tree, return the values of its boundary in anti-clockwise direction starting from roo ...

  10. MYSQL存储过程中事务和DECLARE EXIT/CONTINUE HANDLER的使用

    -- 1.DECLARE EXIT HANDLER FOR SQLEXCEPTION 语句后面可以跟一个 begin end的复合语句块,也可以直接跟一个简单语句例如 :DECLARE EXIT HA ...