我需要对相当大的字符串进行操作——搜索给定短语的出现情况,并使用正确的两个过程/函数Pos和StringReplace在“数据库”(我准备一个带有数据文件以供R进一步处理)上执行各种工作。其中大部分的大小约为20-30 MB,它们有时更大。
从这里的文档中可以看到,所有声明为“String”的字符串都具有相同的特性,例如:
my_string : String;
提示:在 RAD Studio 中,string 是 UnicodeString 的别名。这意味着我不必担心字符串的大小或内存分配问题,因为 RAD 会自动处理。当然,在这个阶段,我可能会问一个问题 - 您认为声明的选择对编译器很重要并且会影响字符串的行为吗? 因为它们从技术上讲是相同的?
my_string1 : String;
my_string2 : AnsiString;
my_string3 : UnicodeString;
对于大小和分配、长度等有一定的意义(我们正在谈论20 MB以上的数据传输)?
现在最重要的问题是如何安全地组合两个大字符串?对内存泄漏、字符串内容安全,程序速度快等方面进行保护。这里有两个选项:
> var string1, string2: String;
> ...
> string1 := string1 + string2;
该文档 这里 和 这里 表明这是在Delphi中连接字符串的方式。但还有另一种方式——我可以预先设置一个非常大的字符串大小,并使用移动过程来移动第二个字符串的内容。
const string_size: Integer = 1024*1024;
var string1, string2: String;
concat_place: Integer = 1;
...
SetLength(string1, string_size);
Move(string2[1],string1[concat_place],Length(string2));
Inc(concat_place,Length(string2));
这似乎更安全,因为该字符串在内存中的区域(大小)不会动态改变,我只需要将适当的值移动到它中。这是一个更好的想法吗?还是有更好的方法?也许我理解错了什么?
另外一个问题是 - 我使用Pos和AnsiPos测试了String和AnsiString搜索,它们在所有组合中似乎都能正常工作。这是否意味着它们现在在Delphi中是相同的?
提前感谢您提供的所有技巧。
string1
和string2
确实是AnsiString
类型,则您的代码片段将起作用。 - Andreas Rejbrand