从事 C/C++ 编程快九个年头了,今天女朋友突然问我:什么时候用 C 而不用 C++?一下子把我的思绪拉入往昔那些使用 C 和 C++ 的“峥嵘岁月”里。女朋友还是原来的女朋友,而我却不是当初的那个我了。 老实说,这些年用 C 和 C++ 分别写过很多项目,也研究像 Linux 内核、Nginx、Redis、freeswitch 等各种经典 C 项目,当然研究的 C++ 项目也不少(例如 MySQL 的源码),玩的不亦乐乎,常看常新,看到这些经典项目的精彩代码处时有时候喜不自禁,那真是笑看妻子愁何在,漫卷诗书喜欲狂。 贴几张图: 调试分析 C 项目 Redis 源码 调试分析 C 项目 Nginx 源码 调试分析 C++ 项目 MySQL Server 8.0 如果一个项目如果对内存和编译后的机器指令做精准控制,那么应该优先选择 C 而不是 C++,C++ 编译器在背后插入了太多的指令。举两个例子: class A { 这个例子说明了在 C++ 中一个对象出了其作用域(这里是 a),会自动调用其析构函数,这是编译器自动加入的:
再比如假设 A 类有一个实例方法 f,编译器的调用 A 方法的实现是编译器自动插入了一个 this 指针作为方法的第一个参数: class A { 汇编代码如下:
同样的道理,如果如果一个复杂的 C++ 工程中,一个类有多个复杂类型成员,而这些复杂类型成员又有多个复杂类型成员,这种层级关系比较深的情况下,上层对象的构造函数会自动触发其成员变量的构造函数的调用,而进而又触发下一级成员变量的构造函数的调用,而析构函数正好反过来,这些构造动作都是编译器自己往开发者的程序中插入的指令。如果要涉及到模板或者像智能指针包裹的对象的构造、析构和移动,那编译器自动嵌入的指令就更多。 |
|
来自: 新用户0118F7lQ > 《微信文章》