System.Classes.pas の既知の醜いパフォーマンス制限を回避しようとしています。この制限には、次のような 1980 年代の一定のバッファー制限 ($F000) があります。
function TStream.CopyFrom(const Source: TStream; Count: Int64): Int64;
const
MaxBufSize = $F000;
....
これにより、Delphi アプリケーションのパフォーマンスが大幅に低下します。Delphi XE2 から XE5 では、これを変更して、次のアプローチのいずれかを使用することができました。
Delphi ソースを変更し、バッチ ファイルから dcc32.exe を呼び出して、Delphi ライブラリ フォルダ内の System.Classes.dcu ファイルを再構築できます。私はこれが醜いことを認識しており、これを行うのは好きではありませんでしたが、RTL でのこの醜いパフォーマンスの問題も好きではなく、ユーザーはそれが引き起こすパフォーマンスの頭痛に耐えられません。
変更した system.classes.pas ファイルをプロジェクトの検索パスのどこかに置くことができます。
おそらく内部コンパイラの変更のおかげで、上記のアプローチのどちらもDelphi XE6で機能していません。uses 句に System.Contnrs を含む最小限のコマンド ライン アプリケーションで発生するエラーは次のとおりです。
[dcc32 Fatal Error] System.Classes.pas(19600): F2051 Unit System.Contnrs was compiled with a different version of System.Classes.TComponent
この問題を再現するためのサンプル プログラム (System.Classes.pas を修正し、MaxBufSize 定数を変更したと仮定) を次に示します。
program consoletestproject;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.Contnrs,
System.SysUtils;
var
List:System.Contnrs.TObjectList;
begin
WriteLn('Hello world');
end.
繰り返しますが、この問題は Delphi XE6 では簡単に再現されますが、XE5 以前では問題になりません。
System.Classes.pas または System.SysUtils.pas または他の非常に低レベルのユニットの変更されたコピーを使用して、基本的な RTL または VCL の制限を絶対に回避する必要がある場合に推奨される方法は何ですか? (はい、必要がないのであれば、これを行うべきではないことはわかっています。講義を気にしないでください。)
上記のアプリケーション例と適切にリンクする変更された DCU を生成するために、コマンド ラインで「dcc32.exe」を介して使用できるコマンド ライン パラメータの魔法のセットはありますか?
二次的な質問として、これを行おうとすると破損するソースが存在しない .dcu ファイルはありますか? RTL では、あなたは不運です」?
考えられる回避策の 1 つは、プロジェクトの検索パス (またはライブラリ パス) に "$(BDS)\source\rtl\common" を含めて、壊れた (再コンパイルが必要な) DCU を毎回強制的に再構築することですが、これは見苦しく間違っているように思えます。