2012年10月10日水曜日

String のインデックス…!?

昨日の記事で、ふーさんに ZEROBASEDSTRINGS について教えて貰いました。

コンパイラ指令 $ZEROBASEDSTRINGS に ON を渡すと Index 0 番目からアクセスできるようです。

{$ZEROBASEDSTRINGS ON}
procedure Test;
var
Str: String;
i: INteger;
begin
i := 0;
Str := 'Hello, helper !';
Writeln(Str[0]); // H が出力される!!!
end;
ちなみに ZEROBASESTRINGS OFF の状態だと Str[0] にアクセスしてるとコンパイルエラーが出ます。

[dcc32 エラー] Project1.dpr(18): E2157 0 番目の要素は参照できません - Length または SetLength を使ってください

で、大事なのはその先です。その先。

ZEROBASESTRINGS ON って、どこで使ってるんだろう?と思って \Embarcadero\RAD Studio\10.0\source\ に対して Grep してみました。
すると fmx\FMX.ASE.Lexer.pas に次のような記述が出てきました。

{$IFDEF NEXTGEN}
{$ZEROBASEDSTRINGS ON}
LHash := BobJenkinsHash(FString[0], FString.Length * SizeOf(FString.Chars[0]), 2004);
{$ZEROBASEDSTRINGS OFF}
{$ELSE}
LHash := BobJenkinsHash(FString[1], FString.Length * SizeOf(FString.Chars[0]), 2004);
{$ENDIF}

NEXTGEN という識別子で条件コンパイルしていました。

……
……!?

NEXTGEN !!!!!

これって噂の新型コンパイラのことでしょうか。
そして、新コンパイラになると String の開始インデックスが 0 になる……?
そう考えると TStringHelper が 0 インデックス初めなのも全て納得がいきます。

oh…!
なんってこった!
もし、そうなら、こいつは大変なことだ!
今までの資産の移行、Unicode 化の比では無い気がする……。
場所を見つけづらいという意味で。
そのための ZEROBASESTRINGS なのか。

NEXTGEN で \Embarcadero\RAD Studio\10.0\source\ に対して Grep すると大量にひっかかります。



一人興奮してるけど、皆さん知ってる事だったりするのかな……?

追記
↓下記のブログに ZEROBASEDSTRINGS について書かれているよ、と教えて貰いました。

XE3 RTL Changes: A closer look at TStringHelper

英語なので良く判らないのですが
Hopefully, you’ve inferred from what I’ve covered so far that zero based strings are something new in the compiler
って書いてある!!ひゃー!

1 件のコメント:

  1. NextGen(Android)とWindowsで処理を分けないといけないといけないと思い、悩んでました。
    とても助かりました。ありがとうございます!



    返信削除