亲爱的德尔福知道汇编者的人 -
我有这个伟大的例程,在Unicode前世界中运行良好。
function StringRefCount(const Src: String): Integer;
asm
test eax, eax
je @Exit
mov edx, eax
mov eax, [edx - 8]
@Exit:
end;
鉴于我的ASM技能充其量只是最基本的,如何在D2009 +中完成?
ADDED:此测试失败:
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;
谢谢 - 我很高兴承认一个重要的大脑放屁。 : - )
尼克
答案 0 :(得分:3)
如果你想看到引用的引用计数,你必须首先在堆上创建一个字符串实例,如下所示:
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;
答案 1 :(得分:3)
32位编译器的代码无需进行任何更改。这是一个错误的测试用例,因为字符串文字的内置引用计数为-1。
对于64位代码(以及新编译器上的32位代码),最好使用RTL已提供的相同名称的函数。