前回の TStringWriter
は Write(Ch: Char);
と Write(const S: string);
というように文字列に追加するための手続きが Char 用と string 用に分かれています。
でも実際には string 用に Char のものを渡しても動くんですよね。
暗黙的に Char -> string
変換が行われるからです。
なのになんで Char 型の手続きを設けているか・・・理由は今回のお題の通りキャスティングコスト(*1)が意外と高いからです。
(*1) 何マナ必要なのかなとか考えた人は私と同類です(笑)
それ以前にキャスティングってなんじゃらほいって人はいるの・・・かな(汗)
劇とかで配役のことをキャストっていますよね。
で、例えばAさんが劇でロミオの役をやるとします。
都合によってAさんがジュリエットの役に変更になったとします(*1)。
このようにある物が別の役割を演じることが出来るときがありますね。
プログラミングでキャスティングといったらある型の値を別の型の値にすることを意味します。
キャスティングによっては特に明示しなくても暗黙的に行われるものがあります。
どの型から型への変換が暗黙的に行われるかは言語によって異なります。
Delphi は余り暗黙的にしないほうの部類に入ります。
(*1) Aさんって男なの、女なの? どっちにしろなんか嫌かも・・・。
で、実際コストは本当に高いの?
・・・・ということで実験。
var
I, J: Integer;
C: Cardinal;
Writer: TStringWriter;
Ch: Char;
begin
Ch := 'a';
C := GetTickCount;
for I := 1 to 100 do
begin
Writer := TStringWriter.Create(100000);
for J := 1 to 100000 do Writer.Write(Ch);
Writer.Free;
end;
Memo1.Lines.Add(IntToStr(GetTickCount - C));
end;
これをそれぞれ Write(Ch: Char);
有りと無しで結果を取ると、有りは 641ms 無しは 9063ms となりました。
というわけで相当に大きく差が出るので Char -> string
のコストもそう馬鹿には出来ないようです。