- 博客(22)
- 收藏
- 关注
原创 nRF52840 Dongle 蓝牙 BLE / Mesh 安装与抓包
系统:Ubuntu 24.04(工作的系统)硬件:Nordic nRF52840 Dongle工具:模块化 nRF Util、nRF Sniffer for Bluetooth LE、Wireshark。
2026-11-12 22:37:43
210
原创 this 指针
this“this”指针是 C++ 中的一个特殊指针,在类或结构的非静态成员函数范围内隐式可用。它表示调用成员函数的当前对象实例的地址。“this”指针允许对象引用自身并访问自己的成员变量和成员函数。this通过this访问成员时,通常使用箭头运算符->连接成员名称。thismemberNamethis在上面的例子中,表达式指的是当前对象的myMember变量/属性,它在myMethod函数中被赋予了42的值。this在 C++ 编程中,各对象分别保存自己的非静态数据成员;
2026-11-01 16:36:31
286
原创 运算符重载 - operator overloading
普通一元运算符的成员形式通常有零个显式参数,普通二元运算符的成员形式通常有一个;换句话说,成员运算符的右侧普通参数可以使用允许的用户定义转换,但其隐式对象参数不能靠用户定义转换实现类型匹配。先决定运算的含义,再决定语法:复数加法、金额相加、容器下标和流输出都能与读者的既有理解对齐。ADL 会根据实参类型搜索关联的类与命名空间,并能够找到在关联类中声明的这种友元函数。如果一个类既没有适用的运算符函数,也不能通过允许的转换使用内建运算,那么相应表达式才会编译失败。的 NRVO 是允许的优化,不能说成总有保证。
2026-10-27 23:28:18
310
原创 C++函数重载
没有可行函数,或者无法选出唯一最佳函数,则调用不合法,需要编译诊断。选出函数后,还可能因访问控制、调用已删除函数等其他规则而不合法,不能将“可行”直接理解成“最终保证合法”。若调用的是虚成员函数,先由静态类型等决定重载选择,再按虚调用规则决定最终覆盖函数;在这里引用的 ABI 中,这类函数的名称编码也不包含返回类型。成员函数还涉及对象的 cv 限定、引用限定等规则,不能把上面的简化说明当作所有函数声明的完整识别规则。普通非模板函数常见的重载方式包括:参数数量不同、参数类型不同,或者参数类型的排列顺序不同。
2026-10-27 23:21:32
157
翻译 C++ 如何解析函数调用
对有经验的 C++ 程序员来说,其中不少内容并不陌生,但把各个环节联系起来看,仍然很有启发,至少我自己是这样。这正是本文最想说明的。例如,普通非限定名称查找如果找到了类成员、某些块作用域内的函数声明,或非函数且非函数模板的声明,就不会再进行 ADL。约束是 C++20 引入的特性,可以直接表达模板的适用条件,在许多场景下替代 SFINAE,并有助于获得更清楚的错误信息。首先,函数必须能够接收本次调用传入的实参:实参数量要符合形参列表的要求,每个实参也必须能通过允许的隐式转换或引用绑定,对应到相应的形参。
2026-10-27 15:02:37
7
原创 C++ friend 函数和 friend 类
友元(friend)机制允许指定函数或类访问某类的 private/protected 成员,授权由被访问类声明,且获权者不成为其成员。它仅改变访问权限,不影响对象生命周期、参数传递方式或名称查找规则。友元函数可与成员函数同名但为独立实体;一个函数访问多个类时需在双方均声明友元。友元类授予整个类访问权限,也可仅授权单个成员函数。友元是编译期机制,不涉及运行时检查,也不影响对象创建条件。
2026-10-27 00:15:57
249
原创 C++模板特化
本文以C++17为例,介绍模板特化的概念与应用。通过类模板和函数模板的显式特化(全特化),可为特定类型提供专门实现;类模板支持偏特化,允许匹配类型模式(如T*),而函数模板不支持偏特化。显式特化需与主模板类型一致,且不能与重载混淆。示例展示了针对char的打印行为定制、指针类型的偏特化选择及字符串字面量的推导规则,强调特化在编译期决定,不影响运行时逻辑。
2026-10-26 22:03:23
157
原创 模板 — template
的某些操作,可以暂时不要求对该类型有效。CTAD 也不是万能的:没有足够的推导信息时仍需显式给出实参,某些设计则需要自定义推导指引。这里的“特化(specialization)”也包括由主模板隐式实例化得到的具体类型或函数,并不专指手写的。在通常的隐式实例化场景中,编译器在需要完整类类型时实例化类模板特化,例如定义一个该类型的对象。对于这里没有参数包的主类模板,如果一个模板参数有默认实参,它后面的模板参数也必须有默认实参。的实例化或让使用方看到模板定义,否则不能形成完整的有效程序,常见表现为链接失败。
2026-10-26 21:53:47
240
原创 智能指针(Smart Pointers)
若一个接口允许外界经基类删除派生对象,应明确设计虚析构,而不是依赖调用者恰好选择了保留派生删除信息的创建路径。合并分配时,强计数归零会析构对象,但该分配中的对象存储区域可能要等弱观察者全部释放后才归还。拥有 A,外部所有者离开后,两者仍各被另一个对象拥有,强计数不能归零。下面的 GIF 会自动循环,依次展示三个过程:独占所有权转移、强弱引用生命周期,以及虚调用与多态析构。本身只是把表达式转换为可用于移动的形式,真正的转移发生在这里的移动构造函数中。的字段,不固定虚表地址、槽位顺序、对象大小或指针数量。
2026-10-26 21:33:05
259
原创 浅复制与深复制
在错误的独占所有权设计中,副本释放缓冲区后,源对象的指针便悬空。如果推广为任意元素类型,元素复制可能抛异常,应使用 RAII 管理尚未提交的新资源,或采用其他能够正确清理中间状态的实现,不能直接照搬这个原始指针版本。拷贝赋值面对的目标对象已经存在,因此必须妥善处理旧资源,并且对自赋值安全。浅拷贝是否正确,取决于指针的所有权约定。对于不可复制的资源,正确选择可能是删除拷贝操作,而不是强行深拷贝。拷贝一个对象时,既要复制它的值,也要明确它与副本之间的资源关系:两个对象应该各自拥有资源,还是可以共享同一个资源?
2026-10-24 17:07:30
222
原创 Run-Time Type Information(RTTI)
RTTI(Run-Time Type Information,运行时类型信息)用于在程序执行时识别类型,并支持某些带运行时检查的类型转换。通过基类指针进行带运行时检查的向下或交叉转换,要求源对象的静态类类型是多态类;从概念上看,编译器知道类的定义和继承关系,会为需要的类型生成描述信息;必须先有独立且可靠的类型不变量。不要把 RTTI 开启和关闭的代码任意混用,尤其是跨库共享继承体系时,可能发生链接失败或运行问题。更精确的规则是:操作数为**多态类类型的泛左值(glvalue,包括左值和将亡值)**时,
2026-10-24 16:57:53
338
原创 C++虚函数
此规则只针对正在构造或析构的对象,不表示构造函数中对其他已构造对象的虚调用也一律失去多态。变化的是对象关联的表以及表项中的调用入口。对象中的 vptr 指向的“地址点”也不一定是整块表的起点。,进行重载决议和访问检查,确认这是一个可调用的虚函数,并检查实参是否合适。这里应读成“对不同动态类型的对象,相同接口最终对应哪些函数”,而不是“标准规定有三张恰好三个元素的数组”。版本,因此不进行虚分派。:在满足继承可访问性、无歧义和 cv 限定等条件时,返回某个类的指针或引用,可以改成返回其派生类的对应指针或引用。
2026-10-24 16:45:22
196
原创 Lambda 表达式
不是编译器必须生成的源码或内存布局。算法可能复制传入的函数对象,因此不要假设算法内部修改了某个按值捕获副本,就一定会改变你手中的那份闭包。相反,函数返回后并非所有引用捕获都失效:如果捕获的是调用者提供的对象的引用,且该对象仍存活,访问仍可有效。的简洁语法,适合向算法传入操作、编写回调,以及把一段逻辑和它需要的状态放在一起。这个复制仍然遵循类自身的复制语义,原始指针、引用、视图等成员不会因此自动获得独立的深拷贝。全局变量、静态存储期变量不需要捕获,符合规则的常量表达式或不求值的使用也可能不需要捕获。
2026-10-24 16:26:41
311
原创 奇异递归模板模式(CRTP)
需要在运行时替换实现、通过同一个基类引用操作不同类型对象,或者保存异构对象时,虚函数接口仍然是 C++ 的常用设计。也应避免在 CRTP 基类的构造、析构过程中调用依赖派生类状态的操作,因为相应状态可能尚未初始化或已被销毁。本例不需要虚函数分派,也便于编译器内联具体实现,但不能据此保证 CRTP 总是更快:内联不是强制的,模板可能增加代码体积和编译成本,虚函数调用也可能被去虚拟化。这适合已知的有限类型集合。名称中的“递归”描述的是类型在模板实参中再次出现,并不意味着函数递归调用,也不意味着无限嵌套的对象。
2026-10-22 23:48:08
303
翻译 mDNS在家庭自动化Matter协议中的实际应用
一旦设备完成配置并成为网络结构的一部分,它们将继续使用mDNS动态广播其运行中的服务,并实时检测网络中的变化。希望成为配置器的设备通过mDNS广播其意图,宣布与配置相关的服务。Matter服务提供者的具体名称,就像指南中的杂货店或餐厅连锁名称一样,会通过PTR记录与各自的Matter服务关联起来。mDNS不仅以结构化的方式促进服务发现,还提供了灵活性,能够无缝适应服务位置、类型和配置的变化。关键区别在于,在配置器发现中,是配置器而不是被配置设备发送mDNS消息,这强调了网络中管理功能的角色反转。
2026-05-12 21:54:16
42
翻译 通过一个简单的例子了解 mDNS
叠甲:英文水平有限,翻译会有错误,欢迎指出。许多家庭自动化设备都会通过多播域名系统(mDNS)在本地网络上宣告自己的存在及其提供的服务。
2026-05-11 14:59:12
35
原创 PASE(Password Authenticated Session Establishment)
PASE 不只是“认证成功”这么简单,它会产出后续 Matter Secure Channel 用的密钥材料:Matter PASE 规定从Ke通过 KDF 派生;Initiator 用I2RKey加密并保护发往 Responder 的消息,用R2IKey解密和验证 Responder 的消息,Responder 方向相反;只用于后续设备认证挑战。PASE 与 CASE 的关系对比项PASECASE使用阶段初次配网 / commissioning入网后的正常通信认证材料。
2026-05-11 10:21:28
362
原创 CASE - 会话建立与密钥派生
CASE 是 Certificate Authenticated Session Establishment 的简称,可以翻译成“基于证书认证的会话建立”。通俗理解:两个已经加入同一个 Matter Fabric 的节点,在正式通信前,先互相验明身份,再各自计算出本次通信要用的临时会话密钥。确认身份:对方是不是同一个 Fabric 里的合法节点?协商密钥:这次通信用哪组临时加密密钥?建立安全会话:后面的 Read / Write / Invoke / Subscribe 都走这个加密通道。
2026-05-10 18:21:41
413
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
2