Move函数有点看不懂,谁来解释一下

procedure Move( const Source; var Dest; count : Integer );
var
S, D: PChar;
I: Integer;
begin
S := PChar(@Source);
D := PChar(@Dest);
if S = D then Exit;
if Cardinal(D) > Cardinal(S) then
for I := count-1 downto 0 do
D[I] := S[I]
else
for I := 0 to count-1 do
D[I] := S[I];
end;

这个是delphi自带的代码里面
Cardinal(D) > Cardinal(S) 这个看不懂
2个pchar转Cardinal到底什么意思,这个大小比较要是为什么?什么影响他们的大小呢???
只有10分了,请帮帮忙
...全文
188 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
moolleychean 2006-12-26
  • 打赏
  • 举报
回复
呵呵,原来是为了拷贝重复区域。关键是没用过这个拷贝重复区域,用到过应该就想到了。
  • 打赏
  • 举报
回复
原来是为了同一个,明白了,谢谢
hangzhou_hammer 2006-12-26
  • 打赏
  • 举报
回复
楼上的 分析 能力真强~~
jadeluo 2006-12-26
  • 打赏
  • 举报
回复
如果Source和Dest是相互重叠的(比如它们两个是同一个数组), 则要根据源和目标哪个在前哪个在后来决定移动应该是从最后一个元素开始还是应该从第一个元素开始,否则会丢失数据。因此,才有了Cardinal(D) > Cardinal(S)这个比较。

比如:
var
A : array [0..99] of byte;
begin
Move(A[0], A[10], 90); //此时必须从最后一个数组元素开始进行移动
Move(A[10], A[0], 90); //此时必须从第一个数组元素开始进行移动
end;
  • 打赏
  • 举报
回复
我刚才跟踪进去看确实是这样,就是不知道为什么要分这个,先后进栈对拷贝有影响速度吗?
十分奇怪
moolleychean 2006-12-26
  • 打赏
  • 举报
回复
Cardinal(D)和Cardinal(S)实际上是把两个PChar的指针(指针本来就是4个字节的整数),强制转换成一个无符号4字节整形数。大小比较不知道有什么意义,无非是在内存中的先后位置。
如果D的位置在后,则从后拷到前,如果D的位置在前,则从前拷到后。可以优化效率吗,疑惑ing?

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧