Delphi使用带字符串的引用计数.
这意味着’1234567890’只有一个内存分配
和所有a,b,c,d,e和f.s参考吗?
type TFoo = class s: string; end; const a = '1234567890'; b = a; c : string = a; var d: string; e: string; f: TFoo; function GetStr1(const s: string): string; begin Result := s; end; function GetStr2(s: string): string; begin Result := s; end; begin d := GetStr1(b); e := GetStr2(c); f := TFoo.Create; f.s := a; end;
解决方法
是的,您的具体示例中只有一个分配.如果您使用了UniqueString,就像mghie所说,或者如果您已经动态构建了字符串,那么即使字符串内容与其他字符串相同,您最终也会得到新的字符串分配.
但是,关于您的具体示例有一个有趣的事实:实际上根本没有为字符串“1234567890”“分配”内存.字符串常量的数据存储在磁盘上的可执行映像中,并在代码访问时由OS分页.它占用内存地址空间,作为整个可执行模块的内存映射的一部分,但由于它由磁盘上的原始可执行文件支持,因此它不构成进程提交的内存的一部分,并且不需要支持页面文件.
例如,此程序将在运行时报告访问冲突:
{$apptype console} uses SysUtils; const s = '1234567890'; procedure Change(const r: string); var p: PChar; begin p := PChar(r); p^ := 'x'; end; begin try Change(s); except on e: Exception do Writeln(e.Message); end; end.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。