Sam*_*ach 5 c# compiler-construction compiler-optimization
如果我有
private string Foo(string decrypted)
{
return decrypted.Substring(blah);
}
Run Code Online (Sandbox Code Playgroud)
和
private string Foo(string decrypted)
{
string s = decrypted.Substring(blah);
return s;
}
Run Code Online (Sandbox Code Playgroud)
这是一样的吗?编译器是否能够删除s?
怎么样
private string Foo(string decrypted)
{
string s = decrypted.Substring(blah);
string t = s;
return t;
}
Run Code Online (Sandbox Code Playgroud)
?
谢谢.
在我看来,问题基本上是“C# 编译器是否支持命名返回值优化(NRVO)?”
我认为这是一个合理的问题,但正如delnan 指出的那样,它并不是特别相关,因为 C# 中的字符串是引用类型。如果您是 C++ 程序员,您可以将引用类型视为本质上等同于指针。因此,尽管您按值返回字符串,但实际上只是按值返回引用,而不是对象本身。这就像您按值返回指针地址一样。不需要创建整个字符串对象的副本,因此优化对您的好处很小。需要 NRVO 的唯一原因是避免遭受大型且昂贵的副本的性能影响,但复制指针/引用并不昂贵。
但是,如果您给出了使用值类型而不是引用类型(例如大型结构)的不同示例,那么通过实施 NRVO 可能会获得显着的性能改进。不幸的是,即使在这种情况下,我也不相信 C# 编译器会这样做。我想 JITer 可能会;我不能肯定地说。(如果现在没有完成,也可以在未来的版本中添加。尽管如此大型的结构在 C# 代码中很少见,所以这不太可能是性能团队目标列表的首要内容。)
有关更多详细信息,建议阅读Jon Skeet 关于C# 中的引用和值的文章。