C++字符串与C#字符串,不同的运行时间.为什么?

C++ string vs C# string, different running times. Why?

本文关键字:字符串 运行时间 为什么 C++      更新时间:2023-10-16

我正在用C++进行实验,以观察变量的范围限定声明和循环中的使用对程序运行时间的影响,如下所示:

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++字符串中的一个糟糕的优化(我强烈怀疑tho)还是其他什么?

C#中的字符串是不可变的,因此赋值可以直接复制到引用上。然而,在C++中,字符串是可变的,因此需要复制字符串的全部内容。

如果你想验证这个假设,试着用一个(明显)更长的字符串常量。C++中的运行时应该上升,但C#中的运行时间应该保持不变。

C#中的字符串是不可变的。C#使用引用和未复制的内存!

在C#中,"你好!"将自动分配给一段内存,并且不会每次都被复制例如:

string a="你好";字符串b=a;

它们指向同一块内存,但在C++中没有!字符串将是相同的,但不在相同的位置,如果你想获得相同的重用,你应该使用指针(或智能指针)

string*a=新字符串("你好");字符串*b=a;