【发布时间】:2014-08-16 09:52:24
【问题描述】:
如何在 Delphi 中有效地交换指针?我正在尝试交换整数类型的指针。以下示例有效,但 I2 在使用 64 位编译时为 0。
program Project11;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
procedure Swap(const P1, P2);
asm
{$if defined(CPUX86)}
xchg ecx, [eax]
xchg ecx, [edx]
xchg [eax], ecx
{$else}
xchg rcx, [rax]
xchg rcx, [rdx]
xchg [rax], rcx
{$endif}
end;
var
I1, I2: Integer;
begin
I1 := 19;
I2 := 564;
WriteLn('Swapping..');
WriteLn('I1: '+I1.ToString());
WriteLn('I2: '+I2.ToString());
Swap(I1, I2);
WriteLn('I1: '+I1.ToString());
WriteLn('I2: '+I2.ToString());
ReadLn;
end.
【问题讨论】:
-
在 asm 中实现交换例程不会比仅使用语言环境临时变量带来任何明显的性能提升。如果你想要线程安全,你可以使用
TInterlocked.Exchange。 -
@StefanGlienke 其实我会用
LOCK XCHG -
这是 TInterlocked.Exchange 所做的......但它也适用于其他平台。
标签: delphi delphi-xe6