The*_*rse 4 delphi string assembly delphi-7
在我的项目中我遇到字符串"内存不足异常"的问题,MM没有使用.问题显示字符串的长度为2 300,000个符号.尽管存在足够的内存并且在相同的代码部分中我可以创建具有100,000,000个字符的刺.
谷歌没有帮助,我无法拆解它(没有技能),所以我决定创建一个最小的测试示例,我可以在字符串少于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.
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常.它只是通过一些额外的操作向全局字符串添加内容.问题是,如果您取消注释标记的字符串,它将显着减慢(有或没有优化).考虑到这在100,001次迭代中赋值一次,它不能减速.
问题:
Delphi中的默认字符串如何工作?
如何避免减速?
如何避免内存不足?
PS如果我将FastMM包含到主项目中,则错误消失pps带有未注释字符串的示例会在3分钟内将Windows 7发送到BSOD(从用户模式).
通过执行分配字符串
s := s + '{' + b + '}';
Run Code Online (Sandbox Code Playgroud)
在长时间运行的循环中,只会破坏你的记忆.你可能有足够的内存用于字符串,但这还不够.你需要内存是连续的,但你的分配模式会使这很难.
通过调用将字符串预分配到其最终所需长度来解决问题SetLength.