Delphi中大字符串的安全串联

问题描述 投票:0回答:1

[我对相当大的字符串执行操作-我搜索给定短语的出现,并执行各种工作,我们称之为“数据库”(我准备了一个带有数据的文件供R中进一步处理),使用正确的两个过程/函数: Pos和StringReplace。其中大多数文件的大小约为20-30 mb,有时还会更大。

从文档here-我知道所有声明为“字符串”的字符串,例如:

my_string : String;

是“注意:在RAD Studio中,字符串是UnicodeString的别名”。这意味着我不必担心它们的大小或内存分配,因为RAD会自动执行它。当然,在这个阶段我可以问一个问题-您认为声明的选择对编译器很重要并且会影响字符串的行为,因为它们在技术上是相同的吗?

my_string1 : String;
my_string2 : AnsiString;
my_string3 : UnicodeString;

它对大小和分配,长度等有重要意义(我们正在谈论的是超过20 MB的皮带)?

现在是最重要的问题-如何安全地将两个大字符串彼此组合?对于内存泄漏和字符串内容是安全的,对于程序速度是安全的,等等。这是两个选项:

> var string1, string2: String;
> ...
> string1 := string1 + string2;

其中文档herehere表示这是在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中是相同的?

提前感谢您提供所有提示。

string delphi substring concatenation concat
1个回答
0
投票

在Delphi中,字符串始终由编译器管理。

实际上,这意味着程序员完全不必担心他们的内存分配或生存期,并且不会(意外)发生内存泄漏。字符串与普通整数一样易于使用和安全(除非您开始做非常奇怪的事情)。

© www.soinside.com 2019 - 2024. All rights reserved.