C++ weak_ptr指针内部实现原理与控制块机制详解
std::weak_ptr通过内部使用一个指向控制块(control block)的指针来实现。控制块是一个包含引用计数和其他相关信息的结构体,用于跟踪std::shared_ptr共享的对象。控制块通常由一个引用计数和一个指向堆上分配的对象的指针组成。
当你创建一个std::shared_ptr时,它会分配一个新的控制块,并将对象的指针存储在其中。然后,如果你使用std::weak_ptr创建一个弱引用,它会共享相同的控制块,但不会增加引用计数。控制块中的引用计数仅由std::shared_ptr维护。
当你需要访问通过std::weak_ptr观测的对象时,你可以使用std::weak_ptr的lock()函数。lock()函数会返回一个std::shared_ptr,它指向与...
cpp 变成./a.out执行文件的编译的过程, 系统是如何启动
编译阶段:使用 C++ 编译器(如 g++)将源代码(.cpp 文件)编译成目标文件(.o 文件)。编译器会将源代码翻译成机器可执行的指令,并生成与平台相关的目标文件。
链接阶段:使用链接器(如 ld)将目标文件和所需的库文件链接成可执行文件。链接器会解析目标文件中的符号(如函数和变量),并将它们与库文件中的定义进行关联,生成最终的可执行文件。
可执行文件的启动:当执行 ./a.out 命令时,操作系统会进行以下处理:
a. 操作系统加载可执行文件到内存中,并为其分配执行所需的资源。
b. 操作系统在加载可执行文件后,会定位可执行文件中的入口点(entry point)。入口点通常是一个特定的函数,如 main 函数。
c. 操作系...
C++编程最佳实践:语法规范与代码优化指南
所有权与指针相关
动态分配出的对象最好有单一且固定的所有主,并且通过智能指针传递所有权,优先考虑 unique_ptr
// perfer owning pointer over raw in virtual c'tor function
class Investment {
// ...
};
class Stock : public Investment {
// ...
};
class Bond : public Investment {
// ...
};
class RealEstate : public Investment {
// ...
};
template <typename... Ts>
std::unique_ptr<...
详解c++17 的 std::filesystem的核心功能与最佳实践
C++17引入的std::filesystem库为文件和目录操作提供了跨平台的标准解决方案,极大简化了文件系统操作的复杂性。本文详细介绍核心功能与使用技巧。
1. 基础概念
1.1 核心术语
// 关键概念
file // 可读写的数据对象,包含内容与属性
directory // 文件容器,包含其他文件的条目
path // 标识文件位置的元素序列,可包含根名称、根目录与文件名序列
1.2 路径类型
// 三种主要路径类型
absolute_path // 完整路径,无歧义标识文件位置(如"/home/user/file.txt")
canonical_path // 不含符号链接、"."或".."元素的绝对路径
relati...
bazel 构建有什么特点
高效的增量构建:Bazel使用哈希算法对每个构建目标进行唯一标识,并跟踪每个目标的依赖关系。这使得在进行增量构建时,只有发生更改的目标及其依赖项会被重新构建,从而提高了构建速度。
多语言支持:Bazel支持多种编程语言,c++ python
声明式构建配置:Bazel使用BUILD文件来声明构建配置,这些文件描述了项目的结构、依赖关系和构建规则。通过声明式的配置,Bazel可以自动推断构建过程中的依赖关系,减少了手动配置的工作量。
时间同步技术全解析:从NTP到TSN
1. 时间同步基础概念
1.1 为什么需要时间同步
分布式系统协调
多媒体同步播放
工业控制精确timing
传感器数据融合
2. AVB 体系/协议框架
2.1 AVB 简介
http://blog.coderhuo.tech/2020/03/22/AVB_summury/
AVB被称为时间敏感网络,它主要解决两个问题
网络传输问题:带宽预留
多媒体同步问题:时钟恢复与播放同步
2.2 AVB协议族中的gPTP协议
AVB域内的每一个节点都是一个时钟,由以下两个角色组成:
一个主时钟(Grandmaster Clock),它是标准时间的来源;
其他的都是从时钟(Slave Clock),它们必须把自己的时间和主时钟调整一致
http...
C++函数设计最佳实践
参数顺序相关
函数的参数顺序为: input -> input/output -> output
函数参数不超过5个
两种情况可能导致参数过多:
函数功能过于庞大, 可以拆分成多个小函数,方便单元测试和代码调试
隐藏了一个潜在的类,包含了这些参数
c++函数的输出一般通过返回值 提供,有时候通过输出参数提供
倾向于使用返回值。可读性好,否则的话按照引用返回,避免返回指针,除非他可以为null
第一个方法 MakePizza(Pizza& pizza) 通过引用参数传递 pizza 对象,并返回一个布尔值来表示制作披萨的结果。如果 busy 为假,则将 pizza 对象的属性设置为指定的值,并返回 true 表示制作成功。否则,返回 f...
共计 128 篇文章,16 页。