我正在尝试使用C ++来观察变量的影响。 scope-bounded-declarations和循环使用在程序的运行时间,如下所示:
for(int i=0; i<10000000 ; ++i){
string s = "HELLO THERE!";
}
和
string s;
for(int i=0; i<10000000 ; ++i){
s = "HELLO THERE!";
}
第一个程序在~1秒内运行,而第二个程序在~250毫秒内运行,如预期的那样。尝试内置类型不会产生显着差异,因此我坚持使用两种语言的字符串。
我和我的一个朋友正在讨论这件事,他说这不会发生在C#中。我们尝试并观察到自己在C#中没有发生这种情况,因为结果是,范围有限的字符串声明不会影响程序的运行时间。
为什么会有这种差异?这是C ++字符串中的一个糟糕的优化(我强烈怀疑)或其他什么?
答案 0 :(得分:7)
C#中的字符串是不可变的,因此赋值只能复制引用。但是,在C ++中,字符串是可变的,因此需要复制字符串的全部内容。
如果要验证此假设,请尝试使用(显着)更长的字符串常量。 C ++中的运行时应该会增加,但C#中的运行时应该保持不变。
答案 1 :(得分:1)
C#中的字符串是不可变的。 C#使用引用和未复制的内存!
在C#“HELLO THERE!”将自动分配到一块内存,每次都不会被复制 例如:
string a =“HELLO”; string b = a;
他们指向同一块内存,但在C ++中没有!字符串将是相同但不在同一个地方,如果你想获得相同的结果你应该使用指针(或智能指针)
string * a = new string(“hello”); string * b = a;