String 如何将一些汇编代码计数的Delphi字符串引用迁移到Delphi Unicode

String 如何将一些汇编代码计数的Delphi字符串引用迁移到Delphi Unicode,string,delphi,String,Delphi,亲爱的了解汇编程序的Delphi人员:-- 我有一个很棒的例程,在Unicode之前的世界里运行得很好 function StringRefCount(const Src: String): Integer; asm test eax, eax je @Exit mov edx, eax mov eax, [edx - 8] @Exit: end; 鉴于我的ASM技能充其量只是初级技能,在D2009+中如何实现这一点 添加:此测试失败: procedure TestS

亲爱的了解汇编程序的Delphi人员:--

我有一个很棒的例程,在Unicode之前的世界里运行得很好

function StringRefCount(const Src: String): Integer;
asm
  test eax, eax
  je   @Exit
  mov  edx, eax
  mov  eax, [edx - 8]

@Exit:
end;
鉴于我的ASM技能充其量只是初级技能,在D2009+中如何实现这一点

添加:此测试失败:

procedure TestStringStuff.TestStringRefCount;
var
  TempString: string;
  TempResult: Integer;
  SecondString: string;
begin
  TempString := 'this is a temp string';
  TempResult := StringRefCount(TempString);
  CheckEquals(1, TempResult);
  SecondString := TempString;
  TempResult := StringRefCount(TempString);
  CheckEquals(2, TempResult);
end;
谢谢——我很高兴承认我的脑子里放了个大屁。:-)


尼克

如果您想看到refcounting的运行,必须首先在堆上创建一个字符串实例,如下所示:

procedure TestStringStuff.TestStringRefCount;
var
  TempString: string;
  TempResult: Integer;
  SecondString: string;
begin
  TempString := 'this is a temp string';
  UniqueString(TempString);  // <-- !!
  TempResult := StringRefCount(TempString);
  CheckEquals(1, TempResult);
  SecondString := TempString;
  TempResult := StringRefCount(TempString);
  CheckEquals(2, TempResult);
end;
过程TestStringStuff.TestStringRefCount;
变量
TempString:string;
TempResult:整数;
第二个字符串:字符串;
开始
TempString:=“这是一个临时字符串”;

唯一字符串(TempString);// 如果要查看refcounting的操作,必须首先在堆上创建一个字符串实例,如下所示:

procedure TestStringStuff.TestStringRefCount;
var
  TempString: string;
  TempResult: Integer;
  SecondString: string;
begin
  TempString := 'this is a temp string';
  UniqueString(TempString);  // <-- !!
  TempResult := StringRefCount(TempString);
  CheckEquals(1, TempResult);
  SecondString := TempString;
  TempResult := StringRefCount(TempString);
  CheckEquals(2, TempResult);
end;
过程TestStringStuff.TestStringRefCount;
变量
TempString:string;
TempResult:整数;
第二个字符串:字符串;
开始
TempString:=“这是一个临时字符串”;

唯一字符串(TempString);// 对于32位编译器,无需对该代码进行任何更改。测试用例是错误的,因为字符串文本具有内置的引用计数−一,


对于64位代码(以及较新编译器上的32位代码),最好使用RTL已提供的同名函数。

对于32位编译器,无需对该代码进行任何更改。测试用例是错误的,因为字符串文本具有内置的引用计数−一,


对于64位代码(以及较新编译器上的32位代码),最好使用RTL已经提供的同名函数。

我的想法与Serg相同。当Delphi更改字符串布局时,他们在数据结构前添加了两个字段,但其余字段保持不变,包括-8的引用计数。您确实应该将其转换为Pascal。然后它可以在任何平台上工作。
StringRefCount
是一个标准函数(在Delphi XE中,不确定以前的版本),无需重新创建。我正在向前转换一个较旧的库--没有意识到系统具有确切的功能。我现在正在给它加别名。再次感谢大家。尼克:很高兴听到这个系统有你需要的程序。但我肯定不是唯一一个想知道为什么需要知道字符串的引用计数的人?传统应用程序中的拜占庭式内存优化?请启发我们!我和塞格的想法是一样的。当Delphi更改字符串布局时,他们在数据结构前添加了两个字段,但其余字段保持不变,包括-8的引用计数。您确实应该将其转换为Pascal。然后它可以在任何平台上工作。
StringRefCount
是一个标准函数(在Delphi XE中,不确定以前的版本),无需重新创建。我正在向前转换一个较旧的库--没有意识到系统具有确切的功能。我现在正在给它加别名。再次感谢大家。尼克:很高兴听到这个系统有你需要的程序。但我肯定不是唯一一个想知道为什么需要知道字符串的引用计数的人?传统应用程序中的拜占庭式内存优化?请启发我们!字符串常量还有一个引用计数字段,以与处理字符串的所有RTL函数兼容。常量的引用计数仅锁定为-1,仅此而已。字符串常量还有一个引用计数字段,以便与处理字符串的所有RTL函数兼容。常数的引用计数仅锁定在-1值,仅此而已。