C ++字符串vs C#字符串,运行时间不同。为什么?

时间:2014-04-26 19:27:05

标签: c# c++ string immutability

我正在尝试使用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 ++字符串中的一个糟糕的优化(我强烈怀疑)或其他什么?

2 个答案:

答案 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;