Delphi 2009 の Unicode(/UTF16) への切り替えは、実行可能ファイルのサイズとメモリ フットプリントにどのような影響を及ぼしますか?
-
01-07-2019 - |
質問
これは「質問が愚かすぎる」部門からの 1 つです。
さて、件名が言うように:影響はありますか?もしそうなら、いくらですか?コードと DFM リソースにあるすべての文字列リテラルは、コンパイルされたバイナリ内で 2 倍のスペースを占めることになりますか?コンパイルされたアプリケーションの実行時のメモリ使用量はどうなるでしょうか?すべての文字列変数は 2 倍の RAM を占有することになりますか?わざわざする必要がありますか?
リリース前のウェブキャストの 1 つでこのような質問があったことを覚えていますが、答えは思い出せません。また、試用期間は 14 日間しかないので、必要なサードパーティ ライブラリが更新される (おそらく 1 か月後) 前に自分で試すつもりはありません。
解決
D2009 ではデフォルトの文字列型として UTF-16 を使用しますが、必要に応じて変数を UTF-8 にすることもできます。
ヤン・ゴイヴァルツ サイズと速度のトレードオフについて説明します 良いブログ投稿で。
DFM の文字列リテラルは、少なくとも D7 以降は UTF-8 です。したがって、D2009 では DFM 内の文字列によってサイズが増加することはありません。
他のヒント
私はついに Delphi 2009 を手に入れることができ、必要な調整を行った後、プロジェクトは問題なくコンパイルされ、実行できるようになりました。:)
結果をすぐに得るために、最初はアプリの少し複雑なモジュールを 1 つコメントアウトする必要があったため、まだ 100% 比較することはできませんが、ソース コードに大量の文字列リテラル (過剰なデバッグ ログ メッセージ) があるにもかかわらず、すでに十分に安全に予測できるようになりました。 ) Delphi 2009 でコンパイルされたバイナリのサイズは、実際には小さくないにしても、おそらく以前とほぼ同じになります。
Delphi コンパイラは実際にバイナリ、または少なくともそのリソース セクションに対して何らかの圧縮を実行しているのでしょうか?私は、UTF-16 文字列リテラルへの変更がこの特定のアプリにさらに大きな影響を与えることを本当に期待していました。リテラルは本当に (非圧縮) UTF-16 としてバイナリ内に保存されていますか?
メモリ使用量の違いを調査する時間がまだありません。
編集: Unicode とは直接関係ありませんが、間違いなく関連しています。アンドレアス・ハウスラーデンは最近、 {$STRINGCHECKS}
コンパイラ オプション (ところで:デフォルトでオンになっています) コンパイルされた実行可能ファイルのサイズ: http://andy.jgknet.de/blog/?p=487
私は何年も Unicode VCL を待っていましたが、ついにそれが登場しました。ほとんどのアプリケーションは、そもそもそれほど多くの文字列リテラルを持っていないか、メモリ内に大量のデータを保存していないため、サイズの問題を心配する必要はないと思います。
Unicode の使用を可能な限り正当化するために、ユーザビリティの問題がより重視されます。
開発者が小さな exe を作成したい場合は、AnsiString を使用して手動で最適化できます (i18n が問題にならない場合)。
私はもう何年も Delphi を使用していませんが、おそらく使用している Unicode エンコーディングに依存します。UTF8 は、通常の ASCII 文字セットとまったく同じになります (特殊な文字を使用する場合にのみ、複数のバイトが使用されます)。UTF16 は少し肥大化する可能性があります。