C++基础知识(四)
链接时重定位和装载时重定位
特性 | 链接时重定位 | 装载时重定位 |
---|---|---|
发生时机 | 发生在编译器进行静态链接或动态链接时 | 发生在程序加载到内存并准备执行时 |
作用 | 将各个目标文件、库文件中的位置无关的代码链接成一个单独的可执行文件或库文件,并对符号进行最终的地址绑定。 | 将可执行文件或共享库中的引用符号和实际地址进行绑定,确保程序能够正确地访问共享库中的函数和数据。 |
阶段 | 链接阶段 | 装载阶段 |
静态链接 VS 动态链接
特性 | 静态链接 | 动态链接 |
---|---|---|
生成的文件 | 大 | 小 |
独立性 | 独立于系统上已安装的库 | 依赖于系统上已安装的共享库 |
加载速度 | 快 | 较慢 |
版本更新 | 需要重新编译 | 可以在不重新编译可执行文件的情况下更新共享库 |
过程 | 在编译时进行链接 | 在运行时进行链接 |
库的整合 | 静态库的代码和数据整合到可执行文件中 | 共享库的代码和数据在运行时加载到进程内存中 |
加载 | 可执行文件包含所有的代码和数据 | 可执行文件只包含对库的引用,加载时需要查找并加载依赖的共享库 |
atomic_flag VS atomic_bool
特性 | std::atomic_flag | std::atomic |
---|---|---|
支持的原子操作 | test_and_set, clear | 所有原子操作(load, store, exchange, compare_exchange 等) |
主要用途 | 通常用于自旋锁等低级同步原语 | 用于需要原子操作的布尔类型场景 |
复制构造/赋值 | 不支持 | 支持 |
指针 VS 引用
特征 | 引用 | 指针 |
---|---|---|
别名 | 变量的别名 | 内存地址的变量 |
初始化 | 必须在定义时初始化 | 可以在任何时候进行初始化 |
空值 | 不存在空引用 | 可以指向空值(nullptr) |
解引用 | 不需要解引用操作 | 需要解引用操作来访问其指向的对象 |
动态内存管理 | 不能进行动态内存的分配与释放 | 可以进行动态内存的分配与释放 |