0

アセンブラを知っている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;

ありがとう-私は主要な脳のおならを認めることを完全にうれしく思います。:-)

ニック

4

2 に答える 2

3

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;
于 2013-01-01T18:22:29.840 に答える
3

32ビットコンパイラの場合、そのコードを変更する必要はありません。文字列リテラルには-1の組み込み参照カウントがあるため、これはテストケースに問題があります。

64ビットコード(および新しいコンパイラでは32ビットコード)の場合、RTLですでに提供されているのと同じ名前の関数を使用することをお勧めします。

于 2013-01-01T23:22:11.963 に答える