私のプロジェクトでは、「メモリ不足の例外」という文字列に問題があり、MM は使用されていません。問題は、文字列の長さが 2 300,000 シンボルになると表示されます。十分なメモリがあり、コードの同じ部分で 100,000,000 文字の文字列を作成できるという事実にもかかわらず。
Google は役に立ちませんでした。逆アセンブルできません (スキルがありません)。そのため、2 000 000 000 シンボル未満の文字列でメモリ不足の例外を取得できる最小限のテスト例を作成することにしました。そのような例を作成することはできませんでしたが、奇妙なものを作成しました:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var s : string;
k : integer;
function b : string;
begin
result := 'f';
end;
procedure c;
var ss : string;
begin
s := s + '{' + b + '}';
ss := 'a';
if k mod 100001 = 0 then
begin
// ss[1] := 'd'; // uncoment me
write(k mod 10);
end;
inc(k);
end;
begin
while true do c;
end.
このコードは正常に動作します。いくつかの追加操作でグローバル文字列に何かを追加するだけです。問題は、マークされた文字列のコメントを外すと、(最適化の有無にかかわらず) 大幅に遅くなるということです。この代入値が 100,001 回の反復に 1 回であることを考えると、速度が低下してはなりません。
質問:
Delphi のデフォルト文字列はどのように機能しますか?
速度低下を避けるには?
メモリ不足を回避するには?
PS メイン プロジェクトに FastMM を含めると、エラーは消えます pps 文字列のコメントを外した例では、Windows 7 を 3 分で BSOD に送信します (ユーザー モードから)。