2008-09-17 4 views
2

「質問はあまりにも愚かではない」部門からのものです:Delphi 2009のUnicode(/ UTF16)への切り替えは、実行可能なサイズとメモリフットプリントにどのような影響がありますか?

さて、被験者の言うとおり、影響はありますか?もしそうなら、どれくらい?私のコードと私のDFMのリソースにあるすべての文字列リテラルは、コンパイルされたバイナリの2倍のスペースを占有しますか?コンパイルされたアプリケーションのランタイムメモリ使用量はどうですか?すべての文字列変数は現在RAMの2倍の量を占めるでしょうか?私も気にする必要がありますか?

初期のプレリリースのWebキャストの1つで尋ねられたようなことを覚えていますが、私はその答えを覚えていません。そして、試用がわずか14日であるので、私が必要とする第三者図書館が更新される前に、試してみるつもりはありません(約1ヶ月で)。

+1

コードで使用される文字列リテラルは、実際に使用されているコンテキストで解釈され、それに応じて実行可能データにエンコードされます。つまり、文字列リテラルがAnsiStringに割り当てられている場合、それはAnsiとしてエンコードされます。リテラルがUTF8Stringに割り当てられている場合は、UTF-8としてエンコードされます。リテラルがUnicodeStringに割り当てられている場合、それはUTF-16としてエンコードされます。 –

+0

DFMは、UTF-8をサポートしています。 Unicode文字列は、UTF-8またはUTF-16としてエンコードできます。 –

+1

実行時のUnicodeString変数は、実行時に2倍のRAMを消費します。 AnsiString、UTF8String、およびその他のAnsiベースの変数はそうしません。 –

答えて

1

D2009では、必要に応じて変数UTF-8を作成することはできますが、デフォルトの文字列型にはUTF-16が使用されます。

Jan Goyvaerts discusses the size/speed tradeoff良いブログ記事。

DFMの文字列リテラルは、少なくともD7以降はUTF-8です。したがって、D2009のDFMの文字列によるサイズの増加はありません。

-2

私は何年も前からDelphiを使用していませんが、おそらく使用しているUnicodeエンコードに依存しています。 UTF8は、通常のASCII文字セットとまったく同じになります(エキゾチックな文字になると、1バイト以上しか使用されません)。 UTF16は少し膨らんでいるかもしれません。

+1

UTF-16は、通常、ラテン文字に基づいていない言語では小さくなります。 –

-1

私は、長年にわたってUnicode VCLを待っていましたが、最終的に見ています。とにかく多くの文字列リテラルを持たないか、膨大な量のデータをメモリに格納するので、ほとんどのアプリケーションでサイズの問題を心配する必要はないと思います。

ユーザビリティの問題は、可能な限りUnicodeの使用を正当化するためにより重視されます。

小さなexeを作成したい開発者がいる場合、AnsiStringを使用して最適化を手渡すことができます(i18nは問題ではない場合)。

0

私は最終的にDelphi 2009を手にしました。必要な調整を行った後、私のプロジェクトはコンパイルされて正常に動作します。 :)

すぐに結果を得るには、アプリの少し複雑なモジュールをコメントアウトする必要がありました。しかし、100%の比較はできませんが、ソースの文字列リテラルがかなり多いにもかかわらず、コード(過剰なデバッグログメッセージ)Delphi 2009でコンパイルされたバイナリのサイズは、おそらく以前とほぼ同じになります。

私は、Delphiコンパイラが実際にどのような方法でバイナリまたは少なくともそのリソースセクションに任意の種類の圧縮を実行するのだろうか?私は本当にUTF - 16文字列リテラルへの変更がこの特定のアプリに大きな影響を与えると予想していたでしょう。リテラルは実際にバイナリの中に(非圧縮の)UTF-16として保存されていますか?

私はまだメモリフットプリントの違いを調べる時間がありませんでした。

EDIT:未直接Unicode関連間違いなく関連:(BTW:デフォルトでオンになって)アンドレアスHausladenは最近{$STRINGCHECKS}コンパイラオプションの(重要な)影響についての興味深いビットを掲載コンパイルされた実行可能サイズ:http://andy.jgknet.de/blog/?p=487

+1

いいえ、バイナリまたはそのリソースを圧縮しません。 UPXなど、外部のサードパーティのコンプレッサを使用する必要があります。 コード内のUnicodeString変数に割り当てられた文字列リテラルは、UTF-16(およびUTF8String変数に割り当てられている場合はUTF-8、AnsiString変数に割り当てられている場合はAnsi)として格納されます。 –

関連する問題