2016-12-14 83 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在工作!