有关C ++的事情使C程序员感到紧张
引擎盖下发生了很多魔术。构造函数,析构函数,虚方法,模板等可以使C ++代码比同等的C代码更容易编写和编写,但更难以理解和推理(取决于您对C ++及其关联约定的了解程度)。简单的操作Foo newFoo;
可能会调用许多代码,具体取决于如何Foo
定义类(及其依赖的任何类)的构造函数。这也是为什么约定是写++it
而不是it++
遍历容器的原因,因为后缀++
通常涉及昂贵的复制操作。
根据您的工作,可能会有一些不小的开销,尤其是对于简单的任务。采取以下两个程序,第一个在C中,第二个在C ++中:
/* C version */
#include <stdio.h>
int main(void)
{
char greeting[] = "Hello, world";
printf("%s\n", greeting);
return 0;
}
/* end C version */
/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
std::string greeting("Hello, world");
std::cout << greeting << std::endl;
return 0;
}
/* end C++ version */
行为相同,在来源方面并没有很多差异,但是在我使用gcc 4.1.2的SLES 10盒上,前者生成了〜9kb大小的可执行文件,而第二个则占用了12.5kb的文件大小(无优化) ),几乎增加了28%。string
与C字符串库相比,C ++ 类型在IMO中的使用要容易得多,C ++流比C流更灵活和可自定义,但是对于像这样的脑筋急转弯的代码,它们可能不值得开销。
与C相比,C ++是一种庞大的语言,具有一些极其复杂的语义。精通C ++比C花费更长的时间,这意味着许多声称知道C ++的人并不像他们认为的那样了解它。
有关C的事情使C ++程序员感到紧张
无论从哪方面讲,C都不是安全的编程语言。没有界限的阵列检查导致大量的开采行为(无论是通过现在死的gets
功能,或通过scanf
与%s
和%[
转换说明)。如果您尝试访问超出其当前定义范围的容器,C ++至少会为您提供引发异常的容器。C给您的所有内容都是(如果您幸运的话)细分违规。
与C ++为您提供的工具相比,C中的内存管理非常耗时且容易出错。如果您要构建自己的容器,则负责对所有malloc
和free
调用进行匹配,确保分配成功,并在发生错误时撤消部分分配等。在C ++中,您只需向或添加项目从容器中取出物品。如果有问题,将引发异常。
类似地,与C ++提供的工具(即,异常)相比,C中的错误处理是一件麻烦事。真正有趣的是,当您分配了一堆内存,然后在处理过程中碰壁时;因为必须退出,所以必须以正确的顺序释放该内存。使用C ++和RAII原理,(相对)容易做到这一点。
那么什么时候我可以一个使用另一个呢?
如果您要编写的内容很简单,那么请阅读该应用程序/随便处理该应用程序/摆脱它的应用程序,该应用程序的行为可以用输入和输出以及性能方面的方式进行清楚地描述,那么C胜于C ++。否则,建议使用C ++