- 博客(74)
- 收藏
- 关注
原创 图吧工具箱+自动化:运维人写的批量检测脚本
介绍图吧工具箱的功能和用途,包括硬件检测、系统优化等常见应用场景,强调其在运维工作中的实用性。总结脚本开发的要点,强调自动化运维的价值,鼓励读者根据实际需求进一步定制脚本。
2026-06-26 10:32:16
44
原创 用OpenCLAW重写CUDA内核
OpenCLAW的设计目标与核心功能与CUDA的对比:编程模型差异(指令级并行 vs 任务级并行)支持的语言特性与硬件后端兼容性。
2026-06-23 10:40:00
191
原创 Typora插件开发指南:打造专属IDE式写作环境
Typora插件开发的核心目标是扩展其功能,使其具备类似IDE的写作体验。通过插件可以实现语法高亮、代码补全、版本控制集成等高级功能。
2026-06-22 13:21:07
291
原创 条款10:优先选用限定作用域enum,而非不限定作用域enum
限定作用域enum的枚举值不会污染外围命名空间,减少与其他标识符冲突的风险。非限定作用域enum的枚举值可能与其他变量或枚举值重名,导致编译错误或逻辑混淆。在需要与C代码交互或必须隐式转换为整数的旧代码中,可能需保留非限定作用域enum。限定作用域enum支持前置声明(forward declaration),编译器可直接确定其底层类型(默认为。显式转换,避免意外的类型转换错误。非限定作用域enum会隐式转换为整数,可能引发未预期的行为。非限定作用域enum需看到定义才能确定底层类型,不利于模块化设计。
2026-06-22 13:19:24
1677
原创 条款08:优先选用nullptr,而非0和NULL
新代码:一律使用nullptr。旧代码迁移:逐步替换NULL和0的指针用法。类型安全:编译器会阻止nullptr误用于非指针场景。通过统一使用nullptr,能显著提升代码的可读性和安全性,减少潜在的运行时错误。
2026-06-15 20:42:10
1958
原创 条款06(缺点):当auto推导的类型不符合要求时,使用显式类型初始化惯用法
当使用auto进行类型推导时,可能会出现推导结果不符合预期的情况,例如推导出错误的类型或丢失必要的修饰符(如const、引用等)。这种情况下,需要通过显式类型初始化来确保变量类型正确。
2026-06-08 22:22:45
1896
原创 条款09:优先选用别名声明,而非typedef
目录条款09:优先选用别名声明,而非typedef(Prefer alias declarations to typedef)共有功能:普通类型、函数指针类型特有功能:模板、命名空间深入理解类型特征(type trait)
2026-06-01 18:55:02
2113
原创 条款07:在创建对象时注意区别()和{}
《条款07:创建对象时区分()和{}的初始化方式》摘要 C++11引入的大括号初始化{}提供了最广泛的初始化语境,能阻止窄化转换并避免解析歧义。相比小括号()和等号=,大括号初始化具有三大优势:1)适用于所有初始化场景(包括容器初始化);2)禁止隐式窄化类型转换;3)免疫"最令人苦恼的解析"问题。然而当类存在initializer_list构造函数时,大括号初始化会优先匹配该构造函数,可能引发意外行为。标准库vector的接口设计就体现了这种矛盾——使用不同初始化方式会产生截然不同的结果
2026-05-25 10:43:56
2057
原创 条款05(优点):优先考虑auto类型推导,而非显式类型声明
目录条款05(优点):优先考虑auto类型推导,而非显式类型声明(Prefer auto to explicit type declarations)优点1:auto可以避免未初始化的变量。优点2:auto可以避免啰嗦/繁琐的变量声明。优点3:auto可以直接持有闭包(由lambda式创建的运行期对象)。优点4.1:auto可以避免由于“类型捷径(type shortcuts)/类型不匹配”所导致的兼容性问题。优点4.2:auto可以避免由于“类型捷径/类型不匹配”所导致的效率问题。优点5:auto可以简化
2026-05-18 16:46:40
2366
原创 条款04:学会查看类型推导结果
本文介绍了在C++开发过程中查看类型推导结果的三种方法:1. 编写代码阶段使用IDE编辑器悬停显示类型信息,但对复杂类型可能不可靠;2. 编译阶段通过故意引发错误让编译器显示类型信息;3. 运行时使用标准库typeid或更可靠的Boost.TypeIndex库输出类型信息。文章指出标准库方法可能忽略引用和const修饰符,而Boost库能准确保留这些信息。最后强调理解类型推导规则是根本,工具结果可能有误,需要综合判断。
2026-05-11 16:06:41
2166
原创 条款03:理解decltype
摘要:条款03探讨了decltype的类型推导机制及其应用场景。decltype通常返回表达式或变量的精确类型,在C++11中主要用于声明返回值类型依赖形参的函数模板,在C++14中通过decltype(auto)扩展应用。文章通过容器访问函数案例,对比分析了C++11和C++14的实现差异,指出auto类型推导会忽略引用性而decltype(auto)能保留完整类型信息。最后讨论了右值容器传递的边缘情况及解决方案,建议使用万能引用和std::forward实现通用引用支持。
2026-05-09 19:03:54
1905
原创 条款02:理解auto类型推导
如果你已经读过“模板类型推导(条款1)”,那么你已经基本掌握auto类型推导(本条款)”的一切必要知识。因为,除了一个奇怪的“例外情况”外,auto类型推导”就是“模板类型推导”。但这怎么可能?“模板类型推导”打交道的是模板、函数、形参,但auto类型推导”和它们毫无相关。事实确实如此,但不影响上面结论的成立。(具体分析如下)
2026-04-27 11:01:53
1939
原创 条款21:必须返回对象时,别妄想返回其引用
请记住:绝不要返回pointer 或 reference 指向一个 local stack对象,或返回 reference 指向一个heap-allocated 对象,或返回pointer 或 reference指向一个local static 对象而有可能同时需要多个这样的对象。一旦程序员认识到pass-by-value在效率方面可能带来的额外开销(见“条款20”),便常常会“矫枉过正”:试图在任何场景下都彻底消除pass-by-value,转而全面采用pass-by-reference。
2026-04-13 15:32:26
1786
原创 条款24:若所有参数皆需类型转换,请为此采用非成员函数
函数,应该将其实现为“成员函数(member function)”还是为“非成员函数(non-member function)”?进一步地,针对非成员函数,应该实现为“友元函数(friend function)”还是为“非友元函数(non-friend function)”?(下面将逐一讨论各种实现的可行性)实现为friend函数,因为operator*()的内部实现可以完全借由Rational的public接口(比如numerator()、denominator())完成任务。,从而实现混合式算术运算。
2026-04-08 16:26:46
1831
原创 条款03:尽可能使用const
在STL中,每个容器内部都会通过using或typedef定义2种类型的迭代器,即iterator和const_iterator。:编译器强制实施bitwise constness,但编写程序时应该使用logical constness。,因为这能借助编译器的力量,在编译期防止意外修改(确保约束不被违反),从而提升程序的正确性与可维护性。:防止客户对返回值进行无意义或错误的修改(详见“条款21”、“条款24”):当const和non-const成员函数有着实质等价的实现时,其出现在星号*的左边还是右边,
2026-03-23 22:07:24
1795
原创 条款12:拷贝对象的所有部分
任何时候,只要你承担起“为派生类编写拷贝函数”的责任,就必须同时确保“基类成分也被正确复制”。所谓“复制每一个成分”,指的正是同时涵盖。:“条款5”表明,当程序需要时,编译器会自动生成拷贝函数。以避免代码重复(见“实现1”和“实现2”)。:当两个拷贝函数之间有着实质等价的实现时(往往如此),:将拷贝函数的共同逻辑提取到一个独立的成员函数(通常。正确复制(正确取值并执行拷贝赋值运算符函数):手工编写(而非由编译器创建)拷贝函数。:在实现拷贝函数时,必须确保(1)“显式调用”相应的基类拷贝函数。
2026-03-09 11:16:52
2172
1
原创 条款09:绝不在构造和析构过程中调用virtual函数
摘要:在C++中,构造和析构期间调用虚函数存在风险。由于基类构造时派生类成员未初始化,虚函数会被解析为基类版本而非预期的派生类版本(如示例中Transaction基类调用自身logTransaction而非BuyTransaction的实现)。同理,析构时派生类成员已销毁,虚函数也会退化为基类行为。解决方案是通过派生类构造函数将信息向上传递给基类非虚函数处理(如传递日志字符串)。核心原则:构造/析构期间避免虚函数调用,此时对象类型被视为当前构造层级的类,多态机制失效。该规则同样影响RTTI(如dynamic
2026-03-05 13:23:00
1403
原创 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
摘要:C++中禁止类拷贝行为的实现方法演进:1)传统方法(C++03)通过private声明未实现的拷贝函数或继承Uncopyable基类;2)现代方法(C++11)使用=delete直接删除拷贝函数。核心思想是明确拒绝编译器自动生成的拷贝功能,适用于需要保持对象唯一性的场景(如房地产类)。不同方法各有利弊,现代C++推荐使用delete语法,能更早发现错误且语义更清晰。(149字)
2026-02-27 10:33:35
1834
原创 条款01:视C++为一个语言联邦
摘要:C++应被视为由四种次语言组成的联邦:1)C语言部分,保留基础语法但受限于缺少现代特性;2)面向对象部分,实现经典OOP范式;3)模板部分,支持泛型编程和元编程;4)STL部分,提供特定的模板库规范。每个次语言都有其独特的高效编程准则,当切换语言层面时,最佳实践可能完全改变。理解这种联邦特性是掌握C++的关键,需要根据不同场景灵活应用相应规则,而非寻求统一编程范式。
2026-02-26 17:19:42
975
原创 条款02:尽量以 const, enum, inline替换 #define
文章摘要:本文建议优先使用const、enum和inline替代#define宏定义。const常量具有类型安全、调试友好和优化空间等优势;enum hack适用于类专属编译期常量;inline函数可避免宏函数的参数求值和优先级问题。虽然预处理器在条件编译中仍有作用,但应尽量减少对#define的依赖,转而使用更安全的现代C++特性如constexpr和模板。核心原则是让编译器而非预处理器处理更多工作,以提高代码的可靠性和可维护性。
2026-02-14 11:45:49
1583
原创 动态规划:打家劫舍系列
针对首尾房间是否被偷,划分为以下几种情况,每种情况均可以使用"打家劫舍1"的代码求解。:环形问题不利于思考,可以将环形展开为线性结构,单独考虑首尾元素是否选取,分情况讨论。:每间房内都藏有一定的现金(非负整数数组),问一夜之内能够偷窃到的最高金额?:每间房内都藏有一定的现金(非负整数数组),问一夜之内能够偷窃到的最高金额?:利用"状态压缩"进行优化 →。
2024-08-05 09:31:45
1791
原创 动态规划:基础篇
1+1 +1(每次爬一个台阶) 由第2层楼梯过来。(后面将讲解的很多动规的题目其实都是当前状态依赖前两个,或者前三个状态,都可以做空间上的优化)爬到第2层楼梯:有2种方法 1+1(每次爬一个台阶)、2(一次爬两个台阶)1 +2(先爬一个台阶、再爬两个台阶) 由第1层楼梯过来。2 +1(先爬两个台阶、再爬一个台阶) 由第2层楼梯过来。爬到第3层楼梯:有3种方法。爬到第1层楼梯:有1种方法。:利用"状态压缩"进行优化 →。:利用"状态压缩"进行优化 →。
2024-08-02 10:09:09
1526
原创 计算机网络学习笔记(七):网络安全
计算机网络上的通信面临以下两大类威胁:被动攻击截获攻击流量分析:攻击者从网络上窃听他人的通信内容。攻击者只是观察和分析某一个协议数据单元PDU,以便了解所交换数据的某种性质,但不干扰信息流。主动攻击篡改更改报文流:攻击者故意篡改网络上传送的报文DNS域名劫持:通过攻击域名服务器或伪造域名服务器的方法,把目标网站域名解析到错误的IP地址(修改域名解析的结果),从而实现用户无法访问目标网站的目的 或者 蓄意要求用户访问指定IP地址(钓鱼网站)的目的。恶意程序。
2024-04-24 10:08:15
3060
8
原创 Git学习笔记(第10章):自建代码托管中心GitLab
GitLab是由GitLab Inc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。GitLab由乌克兰程序员DmitriyZaporozhets和ValerySizov开发,它使用Ruby语言写成。后来,一些部分用Go语言重写。截止2018年5月,该公司约有290名团队成员,以及2000多名开源贡献者。
2024-01-25 10:29:38
2119
原创 Git学习笔记(第9章):国内代码托管中心Gitee
众所周知,GitHub服务器在国外,使用GitHub作为项目托管网站,如果网速不好的话,严重影响使用体验,甚至会出现登录不上的情况。针对这个情况,大家也可以使用国内的代码托管网站-码云。码云是开源中国推出的基于Git的代码托管服务中心,网址是,使用方式跟GitHub一样。另外,Gitee还是一个中文网站,如果你英文不是很好,它将是最好的选择。
2024-01-24 10:57:00
1388
原创 Git学习笔记(第8章):IEAD实现GitHub操作(VSCode)
至此,远程仓库创建完毕(此时远程仓库还未有代码)。:输入远程仓库名 → 选择远程仓库的类型 → 点击“Create Repository”:安装“GitHub Pull Requests and Issues”插件。:点击右上角的“+” → New repository。:本地库推送到远程库(由于网络原因,可能需要尝试多次):添加远程仓库(即本地仓库需要关联哪一个远程仓库):修改远程仓库代码,并提交远程仓库。操作同“6.1.1 创建远程库”:GitHub查看效果。:远程库拉取到本地库。
2024-01-23 11:41:34
1740
原创 Git学习笔记(第7章):IDEA实现Git操作(VSCode)
菜单栏树状视图VS.列表视图Commit:一般不用Refresh:当项目发生改动时,可点击此处进行刷新:各种Git命令的集成Changes红色变为阴影:删除此行(改)红色变为绿色:修改此行(删)阴影变为绿色:添加此行(增)
2024-01-22 17:14:25
1571
原创 Git学习笔记(第6章):GitHub操作(远程库操作)
成员1(大佬)完成代码编写并推送到远程仓库后,随后就到外地旅游了。此时,成员1(大佬)直接登录GitHub对远程仓库进行修改并提交。几天后,成员1(大佬)旅游回到公司,发现其本地库的代码(并不是最新版本)和远程库的代码并不完全一致(不同步)。至此,远程仓库创建完毕(此时远程仓库还未有代码)。远程仓库的别名(remote name) 与 远程仓库的URL 的对应关系。将远程仓库分支上的最新内容拉取到本地仓库的当前分支,并进行合并。要求:成员2(新手)将成员1(大佬)的远程库克隆到自己的本地库。
2024-01-19 13:32:14
1400
原创 Git学习笔记(第4章):Git分支
一般公司会有多个服务器,每个服务器的作用不尽相同,比如开发环境、测试环境、生产环境等。在版本控制过程中,有时需要同时推进多个任务。此时,我们可以为每个任务创建单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
2024-01-18 12:29:25
1625
原创 Git学习笔记(第3章):Git常用命令
命令作用git config --global user.name 用户名设置用户签名git config --global user.email 邮箱设置用户签名git init初始化本地库git status查看本地库状态git add文件名添加到暂存区日志信息文件名提交到本地库git refloggit log查看历史版本版本号版本穿梭。
2024-01-18 11:20:23
1701
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅