内存大挪移 c++ vs Object Pascal (300分)

  • 主题发起人 主题发起人 gxcooo
  • 开始时间 开始时间
G

gxcooo

Unregistered / Unconfirmed
GUEST, unregistred user!
也许大家这样做过:
分配2块内存,然后象数组一样操作这2个内存块,并有时需要交换2块内存(为了速度,只换指针,不挪数据);

在c++里很简单:

short * buf1;
short * buf2

buf1 = new short[BACKWIDTH*BACKHEIGHT];
然后 buf1[k]就可以了
short * temp
buf1=temp;
buf1=buf2;
buf2=buf1;


在Object Pascal里我没想出好方法:
type
TBuf = array of SmallInt;
GetMem(Buf1, WinWidth * WinHeight * SizeOf(SmallInt));
//来个类型转化,很痛苦
TBuf(Buf1)[k - 1]
Temp := Buf1;
Buf1 := Buf2;
Buf2 := Temp;
这明显的是c++快嘛
//////////////////////////////////////////////////////////////////////////////
另外还有个疑惑:
代码1:
//复制象素
for d := 0 to CDepth - 1 do
begin
TBMap(Bitmap2)[pos2] := TBMap(Bitmap1)[pos1];
Inc(Pos1);
Inc(Pos2);
end;

代码2:
Move(TBMap(Bitmap1)[pos1],TBMap(Bitmap2)[pos2],CDepth);

代码一居然比代码2快不少,明明代码一是一个一个复制的,而代码2是整个复制的,就是不是
整个复制的也不致于比代码1慢吧?
 
代码一和代码二的比较,是不是和汇编语言和高级语言的比较有相同之处
 
var Buf1: array of SmallInt;
begin
SetLength(Buf1, WinWidth * WinHeight);
Buf1[K] := 9;
end;
 
to :varphone
方法不错,可动态数组。。。比c++还是有差距吧
忘了说了,这样能交换两个数组吗?只换指针,不挪数据
 
对于问题一:
你可以新建一动态数组,如 var k: array of 类型;然后通过SetLength(k,n);为该数组
开辟n个元素,然后就可以通过k[x]中改变下标x值(0<=x<n),来达到对其中元素的引用。
不用强制类型转换。
对于问题二:
我看了一下System单元Move过程源码。
它实际也是在一个字节一个字节的拷贝,不过多了一些强制类型转换。而且要保证通用性,
而你的上面那段代码是很有针对性的,我想这可能就是反而不如它快的原因吧!
 
gxcooo, 你的做法pascal不比C++慢,看看真正生成的机器码就知道了,
TBuf(Buf1)[k - 1] := 22 ,这个强制转换实际上是
mov word prt [eax + ebx * 2 - $02], $0022一条指令
 

谢谢jps_exp和Archerfl
真的是 mov word prt [eax + ebx * 2 - $02], $0022
看来不比c++差[:D][:D][:D]
 
后退
顶部