一、什么是C++
1、c++ 是一门比较流行的编程语言
\qquad
●https://www.tiobe.com/tiobe-index/2、c++是C 语言的扩展
● 更加关注性能
\qquad
● 与底层硬件紧密结合
\qquad
\qquad
java和python等语相对来说更加关注易用性。
\qquad
● 对象生命周期的精确控制
\qquad
\qquad
C#用完即弃,更易用
\qquad
\qquad
及时释放空间,避免额外开销
\qquad
● Zero-overhead Abstraction
\qquad
\qquad
无需为没有使用的语言特性付出成本
\qquad
\qquad
使用了语言特性不等于付出成本,部分成本在编译器付出,运行期就会很快
new在堆上开辟空间,常量在栈上。
● 引入大量特性,便于工程实践
\qquad
● 三种编程范式:面向过程、面向对象、泛型
\qquad
● 函数重载、异常处理、引用
3、 一系列不断衍进的标准集合
- C++98/03 , C++11 , C++14 , C++17 , C++20
- 语言本身的改进
- 标准库的改进
4、 C++ 标准的工业界实现
编译器:
windows: MSVC
Linux: GCC / Clang
每个编译器可能并不完全遵照标准;不同的实现存在差异
总结:
不能脱离语境讨论C++
编写时要注重:
\qquad
- 性能
\qquad
- 标准
二、C++的开发环境和工具
- VisualC++/GCC(G++)/Clang(Clang++)…
- 集成开发环境:Visual Studio/CodeLite/Code::blocks/Eclipse…
- 工具
/usr/bin/time
valgrind -内存泄漏之类查询
cpp reference 【网站】
Compiler explorer 【网站】
C++insights
cppcon:c++会议,可以在youtube看
编译工具:g++
三、c++的编译连接模型
- 简单的加工模型-
- 问题:无法处理大型程序
加工耗时较长
即使少量修改,也需要全部重新加工 - 解决方案:分块处理-
- 好处
编译耗资源但一次处理输入较少
链接输入较多但处理速度较快
便于程序修改升级 - 由“分块处理”衍生出的概念
定义/声明
头文件/源文件
翻译单元
·源文件 +相关头文件(直接/间接)—应忽略的预处理语句 - 一处定义原则:
· 程序级:一般函数
· 翻译单元级:内连函数、类、模板
c++的编译连接模型
预处理 -> 编译 -> 链接 -> 执行
预处理:-E 获取main.i
- 将源文件转换为翻译单元
- 头文件不应互相包含,防止头文件循环展开:
- #ifdef
- #pragma once
-S:生成啊相应的汇编代码
完整版:
编译: - 将翻译单元转换为相应的汇编语言表示
- 编译优化
-O0
debug:引入优化少【开发】
release:引入优化多 【最后编译使用】
源文件变化只编译源文件,头文件变化需要全部重新编
增量编译和全部编译
汇编:
链接: 合并多个目标文件,关联声明与定义
- 连接(Linkage)种类:内部连接、外部连接、无连接
- 链接常见错误:找不到定义
C++的编译/链接过程是复杂的,预处理、编译与链接都可能出错
编译可能产生警告、错误,都要重视
.o:目标文件
三、小结
- C++是一门注重性能的程序设计语言
- C++的标准经历类一系列的衍化,还在不断发展
- 标准与具体实现之间存在差距
- C++源程序转换成可执行文件是相对复杂的过程,主要包含预处理、编译、链接等阶段,每一阶段都可能引入错误