编译器是否优化字符串连接?

Jer*_*dge 4 delphi string concatenation compiler-optimization delphi-xe2

我在我的代码中有一些情况,我正在构建一个大的文本字符串,例如复杂的SQL语句.我打算将这个文本连续多次放在一起,每个都有一些略有不同的参数.我习惯使用一个名为just的子程序,procedure A(const S: String);它只是将text(S)附加到较大的字符串中Text := Text + S + #10 + #13;

我想知道这是否会阻碍性能而不是使用传统的字符串连接?我开始认为编译器优化了这样的东西:

Text := 'some' + ' ' + 'text' + ' ' + 'and' + ' ' + 'such';
Run Code Online (Sandbox Code Playgroud)

Text := 'some text and such';
Run Code Online (Sandbox Code Playgroud)

这是真的?编译器是否优化了这种情况?如果是这样,我可能会决定将所有内容更改为以下内容:

Text := 'select something from sometable st'+#10+#13+
  'join someothertable sot on sot.id = st.sotid'+#10+#13+
  'where sot.somevalue = 1'+#10+#13+
  'order by sot.sorting';
Run Code Online (Sandbox Code Playgroud)

理论上这会比这更快吗?

Text:= Text + 'select something from sometable st'+#10+#13;
Text:= Text + 'join someothertable sot on sot.id = st.sotid'+#10+#13;
Text:= Text + 'where sot.somevalue = 1'+#10+#13;
Text:= Text + 'order by sot.sorting';
Run Code Online (Sandbox Code Playgroud)

或者我通常如何做到:

A('select something from sometable st');
A('join someothertable sot on sot.id = st.sotid');
A('where sot.somevalue = 1');
A('order by sot.sorting');
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 9

一个表达式

'a' + 'b'
Run Code Online (Sandbox Code Playgroud)

在编译时进行评估.这意味着一项任务

str := 'a' + 'b';
Run Code Online (Sandbox Code Playgroud)

导致相同的编译代码

str := 'ab';
Run Code Online (Sandbox Code Playgroud)

另一方面,为

str := 'a';
str := str + 'b';
Run Code Online (Sandbox Code Playgroud)

串联在运行时执行.