![]() |
1
21
编译器对字符串连接有特殊的处理,这就是为什么第二个示例只有 一 字符串。而“interning”意味着即使你运行这行20000次,仍然只有一个字符串。 正在重新测试结果…最简单的方法(在本例中)可能是查看反射镜:
如你所见(
|
![]() |
2
3
文字字符串是
interned
这意味着
编辑: 我不确定数据段语句,请参阅 this question 更多信息。 |
![]() |
3
0
实际上,可能是3。一个常量字符串表示“再见”,一个常量字符串表示“残酷世界”,然后一个新字符串表示结果。 您可以通过查看生成的代码来确定这一点。它取决于编译器(实际上,还取决于语言,这并不明显),但是您可以通过使用-a标志(我认为,检查手册页)来读取g++的输出来获取中间代码。 |
![]() |
4
0
不要相信你对弦的“了解”。您可以查看字符串实现的源代码。例如,您的示例:
在Java中,将分配一个字符串。JAVA玩一些可爱的把戏,很难胜过——直到你需要的时候才优化! 但据我所知,目前使用的是:
创建1000个空间字符串的效率仍然非常低 在循环中追加是相当糟糕的,但否则它可能和StringBuilder一样高效。 |
![]() |
5
0
在这里要小心,因为当字符串值在编译时已知时,编译器可以进行一些非常不同的优化。如果直到运行时(从配置文件、数据库或用户输入中提取)才知道您使用的字符串,您将看到一些非常不同的IL。 |
![]() |
6
0
如果你只需要做一两个字符串连接,我就不用担心了。 但是,如果您有很多连接,或者您有一个循环,那么您肯定希望采取预防措施。在Java世界中,这意味着使用StringBuffer连接字符串。 |
![]() |
7
0
如果不只是在一行中,则可以通过将第一个字符串放入StringBuffer、进行连接并返回结果字符串来完成两个字符串的连接。 你自己创建StringBuffer可能看起来有点过分,但无论如何都会发生这种情况。- |
![]() |
8
0
无论如何,不要过早地优化,但不要低估字符串连接的性能有多差。这不是对象创建,而是它导致的GC工作。 上有一个实验室(ASP.NET升级工程师) Tess Ferrnandez's 博客是一个(相当极端的,理所当然的)例子 how string concatonation can bring a server to its knees . |
![]() |
9
-1
如果编译器是“智能的”,它只会是一个带有“再见,残酷的世界”的字符串。 |
![]() |
Emanuel Pinho · 无不变目标push的角度变化检测策略 7 年前 |
![]() |
MingtyeP · 如何使用不可变js取消移动列表中的每个元素? 7 年前 |
![]() |
Brannon · 让赋值运算符在申报时工作 7 年前 |
![]() |
Javallion · JAVA中的不可变对象初始化 7 年前 |
![]() |
Ankush Pandit · 字符串与字符串数组元素之间的比较 7 年前 |
![]() |
plamkata__ · Swift到Kotlin,管理不可变列表 7 年前 |