【问题标题】:C++ string vs C# string, different running times. Why?C++ 字符串与 C# 字符串,不同的运行时间。为什么?
【发布时间】:2014-06-12 11:46:56
【问题描述】:

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

【问题讨论】:

  • 我很确定您在没有在 C++ 中启用优化的情况下进行了此测试。大多数 C++ 编译器都会删除整个代码块,因为它没有明显的副作用。

标签: c# c++ string immutability


【解决方案1】:

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

在 C# 中“你好!”会自动分配到一块内存,不会每次都复制 例如:

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

它们指向同一块内存,但在 C++ 中不!字符串将相同但不在同一个地方,如果你想获得相同的结果,你应该使用指针(或智能指针)

string *a = new string("hello"); 字符串 *b = a;

【讨论】:

    【解决方案2】:

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

    如果您想验证这个假设,请尝试使用(显着)更长的字符串常量。 C++ 中的运行时间应该会增加,但 C# 中的运行时间应该保持不变。

    【讨论】:

    • 对,C++ 中的等价物是使用const char* s;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多