C和C++哪个更快?

身边的人一般说到这个问题,总会马上第一个回应我,C语言的速度更快。但实际上,这个问题并不是可以这样单纯的来回答的。下面就我个人的一些体会以及看书时了解的内容,对这个问题做一个粗浅的整理和总结。如有疏漏,欢迎指出。

一、什么是C,什么是C++

说起来,我觉得这是一个非常难以回答的问题。因为我们在这样说的时候,已经暗含了默认常规的C代码不属于C++的意思。但由于C++对C的兼容,实际上C语言实现的功能也是C++能实现的功能。我们平时更多要进行对比的,是在解决某一个问题时,C语言编写者编写程序常规的思路和方法与C++程序编写者编写程序的常规的思路和方法写出的程序在效能上的对比。从某种意义上来说,优秀的C语言程序员写出的程序和优秀的C++程序员写出的程序基本上不会有太大的效率上的差异的。但考虑到真正优秀的程序员的稀缺性,尤其是庞大复杂的C++语言导致优秀的C++程序员更是少见,所以我还是决定就这个问题进行一个粗浅的探究。

二、哪些时候C++比C更快

在写这部分的时候,我脑中总是会不停地回响起很多人的声音:“C肯定比C++快啊”。因此,我针对这个问题进行了一些搜索,试图找到C++比C运行更快的案例,结果是我找到了下面这样三个具体的实验案例。

第一个实验,字符串连接实验

当做字符串连接的操作时,一个常规的C程序员,首先会想到的事分配足够空间的字符数组,然后利用strcat函数进行字符串连接(当然,高手若使用更特殊的方法来达到非常高效的实现的情况不做考虑。因为针对不同的情境,需要进行不同的特定优化,这样实现需要付出比较高的代码优化设计的代价。)而一个常规的C++程序员则会选择使用string类,并利用string类的拼接操作。

int main()
{ 
    int i; 
    char s[10001]; 
    string str,str2,str3; 
    clock_t t; t=clock(); 
    s[0]=0; 
    for (i=0;i<10000;i++) strcat(s,"a"); 
    printf("strcat used %ld clock ticks\n",(clock()-t));

    t=clock(); 
    str=""; 
    for (i=0;i<10000;i++) str=str+"a"; 
    printf("string used %ld clock ticks\n",(clock()-t));

    t=clock(); 
    str2=""; 
    for (i=0;i<10000;i++) str2+="a"; 
    printf("string2 used %ld clock ticks\n",(clock()-t));

    t=clock(); 
    str3.reserve(10000); 
    str3=""; 
    for (i=0;i<10000;i++) str3+="a"; 
    printf("string3 used %ld clock ticks\n",(clock()-t));
}


 上面4部分代码在我的电脑上输出的结果依次是40,8,1,0 (windows平台g++ 4.8.2)。str的拼接是一个新手程序员的写法,str2的拼接是一个比较常规的写法,而str3则是比较优化的写法(对于C语言的实验,我暂时没有想到比较简单的优化方法,想到的只有自己写拼接函数,并且维护字符数组的有效长度信息,实现起来相比下面的优化实在有些麻烦)。str=str+"a"的实现机制是对加号左边的字符串复制生成一个临时string变量,然后将加号右边的append进去,最后再复制给等号左边的string变量。str2+="a"的实现机制则是直接将右边的string append到左边的string变量中。相较之下,后者的开销要小非常多。而str3.reserve(10000)操作,避免了string动态增长时候的反复的内存分配,因此会有更高的效率。 

下面说说为什么C语言实现的字符串连接会慢这么多。主要还是C语言字符串结构的特点造成的。C语言的字符串的结束要以'\0'来作为标记。当我们执行strcat的时候,首先要找到字符串的结尾'\0',这是一个O(n)的操作,然后在其后添加要连接的字符串(所以strlen要慎用,它也是一个O(n)的操作)。而C++的string类是保存有字符串的长度的信息的,因此找字符串的结尾是一个O(1)的操作。因此要想优化C语言的字符串连接,就需

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值