为了账号安全,请及时绑定邮箱和手机立即绑定

C#是否优化字符串文字的串联?

/ 猿问

C#是否优化字符串文字的串联?

慕慕0277861 2019-11-19 11:15:14

例如,编译器是否知道要翻译


string s = "test " + "this " + "function";


string s = "test this function";

从而避免使用字符串连接对性能造成影响?


查看完整描述

3 回答

?
FFIVE

是。这由C#规范保证。在C#3.0规范的7.18节中:


只要表达式满足上面列出的要求,就会在编译时对表达式求值。即使表达式是包含非恒定构造的较大表达式的子表达式,也是如此。


(“上面列出的要求”包括应用于两个常量表达式的+运算符。)


查看完整回答
反对 回复 2019-11-19
?
慕雪6173905

只是一个相关主题的旁注-C#编译器还将使用' +'运算符对String.Concat()方法的多参数重载的单个调用来“优化”涉及非文字的多个串联。


所以


string result = x + y + z;

编译成相当于


string result = String.Concat( x, y, z);

而不是更幼稚的可能性:


string result = String.Concat( String.Concat( x, y), z);

没什么大不了的,但只是想在有关字符串文字串联优化的讨论中添加这一点。我不知道这种行为是否是语言标准规定的。


查看完整回答
反对 回复 2019-11-19
?
当年话下

是的-您可以使用ILDASM明确看到这一点。


例:


这是一个与您的示例相似的程序,后跟已编译的CIL代码:


注意:我使用String.Concat()函数只是为了查看编译器如何处理两种不同的串联方法。


程序


class Program

{

    static void Main(string[] args)

    {

        string s = "test " + "this " + "function";

        string ss = String.Concat("test", "this", "function");

    }

}

伊尔达斯


.method private hidebysig static void  Main(string[] args) cil managed

{

  .entrypoint

  // Code size       29 (0x1d)

  .maxstack  3

  .locals init (string V_0,

           string V_1)

  IL_0000:  nop

  IL_0001:  ldstr      "test this function"

  IL_0006:  stloc.0

  IL_0007:  ldstr      "test"

  IL_000c:  ldstr      "this"

  IL_0011:  ldstr      "function"

  IL_0016:  call       string [mscorlib]System.String::Concat(string,

                                                              string,

                                                              string)

  IL_001b:  stloc.1

  IL_001c:  ret

} // end of method Program::Main

请注意,在IL_0001上,编译器如何创建常量“测试此函数”,而不是如何对待String.Concat()函数-后者为每个.Concat()参数创建一个常量,然后调用.Concat()功能。


查看完整回答
反对 回复 2019-11-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信