2016-12-14 80 views
0

我的C代码是:为什么C++在这段代码中比C快得多?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void){ 
    char* a = (char*)malloc(200000); 
    for (int i = 0;i< 100000;i++){ 
    strcat(a,"b"); 
    } 
    printf("%s",a); 
} 

我的C++代码是

#include <iostream> 
int main(void){ 
    std::string a = ""; 
    for (int i = 0;i< 100000;i++){ 
    ¦ a+="b"; 
    } 

    std::cout<<a; 
} 

在我的机器,C代码中大约5秒运行一次,而我的机器上,C++代码在0.025运行!秒。

现在,C代码不检查溢出,没有C++开销,类,但是比我的C++代码慢了不少。

使用在Raspberry Pi上使用-O3编译的gcc/g ++ 6.2.0。

+0

可能是因为'strcat()'是一个不会被内联的库函数,而'std :: string'是一个模板类的(专门化),所以操作是 - 取决于优化设置 - 更可能是内联。还有一个事实是,您的C版本会动态分配比所需更大的缓冲区,并且根据系统上可用的资源,这可能会降低操作速度。请注意,您的C++代码不能保证编译,因为''不需要定义'std :: string'。 – Peter

+0

我猜想C使用一个以空字符结尾的字符串,所以'strcat'搜索字符串的结尾。 C++字符串不需要这样做,因此连接速度更快。 –

+0

@ErwinKalvelagen哇。 Shlemiel的绘画算法在工作 –

回答

0

@erwin是正确的。

当我改变我的代码

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
void mystrcat(char* src,char* dest,int lenSrc){ 
    src[lenSrc]=dest[0]; 
} 
int main(void){ 
    char* a = (char*)malloc(200000); 
    for (int i = 0;i< 100000;i++){ 
    mystrcat(a,"b",i); 
    } 
    a[100000] = 0; 
    printf("%s\n",a); 
} 

大约需要.012s运行(主要是印刷大屏幕)。

Shlemiel's the painter's algorithm在工作!