- 博客(435)
- 资源 (1)
- 收藏
- 关注
原创 C++Primer学习笔记:第1章 开始
本博客为阅读《C++ Primer》(第5版)的读书笔记第1章 开始在大多数系统中,main的返回值被用来指示状态。返回值0表示成功,非0的返回值的含义由系统定义,通常用来指出错误类型。在Unix中程序运行以后返回值保存在$?中(必须在刚运行后打印输出)编译时可能需要加上-std=c++11打开对C++11标准的支持,一般会加上-Wall参数,可以对有问题的程序结构发出警告如果想要通过打印语句进行调试,一定要及时使用endl操纵符刷新流,否则如果程序崩溃,可能无法得到输出信息,从而导致关于程序崩溃
2020-10-26 19:48:58
369
2
原创 在C++源代码中嵌入着色器程序的最佳实践
本文比较了在C++中嵌入GLSL着色器的两种方法:STRINGIZE宏和C++11原始字符串字面量。STRINGIZE宏通过可变参数版本可安全处理逗号,支持宏展开,但需注意编译器差异;原始字符串字面量语法清晰、调试友好且完全安全,是现代C++的推荐选择。两者各有优势,STRINGIZE适合需要宏展开的旧项目,而原始字符串更适合新项目。选择取决于项目需求、C++版本和团队偏好。
2025-10-15 14:43:54
360
原创 C++ std::make_shared 可能导致对象内存延迟释放
对于make_shared创建的控制块,weak_ptr会延长控制块的生命周期,进而导致整个内存块(包括对象部分)的释放被推迟。尽管如此,在大多数场景下,这一行为并不会引起问题,在代码规范性和性能上的优势仍然使其成为创建shared_ptr的首选方式。但在需要精确控制内存释放时机的特定场景(如存在大量weak_ptr累积的缓存池设计中),开发者应当注意可能带来的额外内存占用影响。
2025-09-24 11:15:15
874
原创 Windows Qt6 项目中集成 Google Test
本文档介绍如何在使用 CMake 管理的 Qt6 项目中集成 Google Test 测试框架。
2025-09-02 16:23:07
227
原创 CLion 中配置运行 Qt 项目指南
对于使用 Qt Creator 开发的项目,迁移到 CLion 进行开发可以获得更强大的 C++ 开发体验(已经被CLion养废了)。本文将详细介绍如何正确配置 CLion 来运行 Qt 项目,并解决常见的依赖问题。通过正确配置工具链、CMake 环境变量,并结合工具自动化部署依赖库,可以在 CLion 中顺利运行 Qt 项目。
2025-08-29 18:06:31
1144
原创 FFmpeg 视频旋转信息处理:3.4 vs 7.0.2
FFmpeg 在处理视频旋转信息方面经历了重要的架构变化。本文档详细对比了 FFmpeg 3.4 和 7.0.2 在封装(muxing)和解封装(demuxing)视频旋转信息时的差异,并提供兼容性解决方案。文档内容由Claude Sonnet 4辅助撰写,如有疏漏还请斧正。FFmpeg 3.4:支持 metadata 和 side data 双重机制:主要依赖 side data 机制,弱化 metadata 支持FFmpeg 3.4:过渡期版本,同时支持 metadata 和 side data。
2025-08-08 17:13:22
517
原创 FFmpeg 升级指北
主要思路是先定位旧版本中相关 API/结构体的源码实现,然后在高版本 FFmpeg 源码的对应位置(或通过搜索相关功能关键词),查看新版本是如何实现相同功能的。互联网搜索与 AI 辅助:如果在官方文档中没有找到直接的答案(特别是对于一些隐晦的变更或行为差异),搜索引擎和开发者社区(Stack Overflow 等)是重要的补充。文档详细列出了当前版本(如 7.0)相比旧版本废弃的 API、结构体成员、宏等,并且明确指明了应该使用的新接口或替代方案。在完成本次升级后,我整理了遇到的一些API变动。
2025-07-04 20:45:06
598
原创 Mac下Android Studio扫描根目录卡死问题记录
这个问题揭示了Android Studio在Native代码支持方面可能存在的同步机制缺陷。关键规避方法是避免使用自动弹出的"Sync Now"按钮。希望Google能尽快修复这个影响开发效率的问题。
2025-06-06 15:16:58
924
原创 在Android项目中集成Google Test测试Native代码指南
使用CMake FetchContent管理依赖基本的测试用例编写测试输出重定向到Logcat的可靠方法这种方法可以方便地在Android环境中运行和查看C++单元测试结果,适合持续集成和日常开发使用。
2025-06-05 14:56:07
1075
原创 Leetcode第451场周赛分析总结
对这种需要多重转换组合的问题,一旦卡住就没法继续下去。以后对于每个思考的方向,物理化自己的思维过程,把卡住的地方转换成新的问题重新思考,不要卡住了就想来想去没有进展。3560. 木材运输的最小成本3562. 折扣价交易股票的最大利润3563. 移除相邻字符后字典序最小的字符串。
2025-05-31 05:59:53
897
原创 FFmpeg中使用Android Content协议打开文件设备
本文介绍了在FFmpeg 7.0+中支持Android content协议处理文件的方法。随着Android 10引入Scoped Storage机制,传统文件访问方式受限。新方案通过直接使用content URI,简化了多媒体处理流程,相比传统文件描述符方案更高效且兼容性更好。
2025-05-21 15:28:32
1005
原创 Android FFmpeg 交叉编译全指南:NDK编译 + CMake 集成
Android FFmpeg 交叉编译 + JNI 集成实战指南,涉及环境搭建、NDK 配置、FFmpeg 编译优化、CMake 集成、Android Studio 适配等关键步骤。
2025-04-25 16:12:43
2177
4
原创 音视频小白系统入门课-4
本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅将mp4文件转换为yuv文件是一个伪编码器,仅仅进行数据格式转换,不进行有损编码yuv数据仅仅存储视频,不存储音频yuv没有元信息,需要手动指定分辨率等信息
2025-04-23 10:29:07
1220
原创 音视频小白系统入门课-3
帧率:每秒采集/播放图像的个数 15帧/s(直播) 25(动画) 30(录制) 60(电影)H264的压缩比一般能达到100:1左右,H265的压缩比平均是H264的2倍。YUV(也称YCbCr):Y表示明亮度,UV的作用是描述影像色彩及饱和度。SAR(Sample Aspect Ratio,采样宽高比)BMP格式使用 BGR格式,导致显示的颜色不对。PPI > 300就属于视网膜级别。RGB:用于屏幕图像的展示。YUV:用于采集和编码。
2025-04-22 10:08:37
986
原创 C++中decltype遇到引用类型时的隐藏陷阱
为了进一步理解这个问题,我借助了《Effective Modern C++》中条款 4 提到的一个技巧:通过声明一个未定义的模板类,并在模板实例化时查看编译器的类型推导报错信息。返回的仍旧是引用类型。可以解决问题,但这让代码的复杂度增加了。可以获取变量的声明类型。然而,当变量是一个引用类型时,但是,编译器却发出警告,提示。这种方式更容易阅读,也避免了使用复杂的类型萃取。这种方式可以减少重复声明,提升代码可读性。返回值中的引用部分,再手动加上。在这段代码中,我的目标是让。如果类型较长,可以通过。
2025-01-06 16:30:43
531
原创 C++ 中如何优雅地返回一个递归闭包函数?
通过闭包函数,将建图与DFS逻辑绑定,简化了调用接口,同时减少了显式参数传递的麻烦。这种高级技巧在C++中并不常见,但在特定场景(小型、局部的递归场景)下能够显著提升代码的可读性与复用性。然而,闭包函数的使用也需要谨慎,特别是在C++中,变量的捕获方式直接影响代码的安全性与性能。通过对捕获规则(值捕获、引用捕获、移动捕获)的深入理解,可以更安全、高效地使用闭包,提高代码质量。
2025-01-03 16:12:09
1025
原创 Leetcode 第426场周赛分析总结
也可以先直接获取n的长度,然后计算得到,这样时间复杂度由O(logn)优化为O(1)在C++20中可以使用头文件中的函数,传入一个无符号整数,会返回其所需的最小位数(也就是最高位1的位数)如果题目要求大于n的数,我的第一思路是判断n是不是2的幂次减1,分类讨论。灵神说不必如此,相当于我们已经拥有了求大于等于n的能力,那么对于大于n的情况,我们只需要求大于等于n+1,即在整数域上:> x相当于 >= x + 1,这是一种思维的转换能力。
2025-01-03 15:23:30
879
原创 给六年前自己的一封信
或许六年后的我,同样会遗憾自己没有做的更好,没能达到更高的层次,没能走的更长远,但如果我能始终保持热爱,保持思考,那就没有什么遗憾的。
2025-01-02 18:12:24
651
原创 Leetcode 第425场周赛分析总结
题目描述看完发现不是非常trivial,看了一眼数据范围,觉得不要多想直接暴力好了。闪过念头不会把数据范围变成1e5就是第三题吧,AC之后去看了一眼发现不是松了一口气。简单想了一下感觉可能和滑动窗口有关,但是却没有发现单调性,没有什么思路。下来认真看了灵神的视频,发现果真复杂。发现自己目前存在一个问题,对于不能一眼看出思路的算法题会产生抗拒,不愿意静下心认真思考解决的方案,似乎遇到困难就会缩起来。这可能是之前刷题的时候总是苛求自己,导致闪回,遇到自己能力的边界不是一件可耻的事情。
2024-11-30 12:22:36
1268
1
原创 Bazel项目使用网络库libhv
记得在2023年末,我还在腾讯实习时,偶然听了一场关于使用Bazel替代CMake管理C++项目的技术讲座。了解到在大公司内部,大家同样不堪CMake的纷繁复杂,更加青睐语义直观、支持多语言、拥有更高一致性的Bazel。这激发了我对Bazel的兴趣。,便萌生了为这个茁壮成长的网络库添加Bazel编译支持的想法。经过一段时间的学习和尝试,终于磕磕绊绊地完成了这项工作,并提交了相关的。在这里,简单介绍一下如何在自己的Bazel项目中使用网络库libhv。幸运的是,得到了libhv开发者的支持,这让我非常开心。
2024-07-26 17:51:36
717
1
原创 rpm打包新手入门
RPM(Red Hat Package Manager)是一种软件包管理工具,主要用于Red Hat及其衍生发行版如Fedora、CentOS等。RPM可以帮助用户方便地安装、升级、删除软件包。通过学习rpm包的相关知识,我们可以将自己的软件打包成rpm包,以便于在基于Red Hat的Linux发行版(如Fedora、CentOS等)上进行分发和安装。
2023-10-11 15:08:06
805
原创 C++ 条件变量的使用
并发编程纷繁复杂,其中用于线程同步的主要工具——条件变量,虽然精悍,但是要想正确灵活的运用却并不容易。希望大家看完下面的介绍能够得到想要的答案。
2022-11-16 13:03:51
1786
2
原创 C++ map/unordered_map元素类型std::pair<const key_type, mapped_type>陷阱
我们要千万小心`map`和`unordered_map`的元素类型为`std::pair`,如果忘记`const`可能会不小心产生拷贝操作,不仅仅会带来性能损耗,而且可能会产生RuntimeError。
2022-07-14 16:16:46
716
原创 C++ 工具函数库
在写一些大型项目的过程中经常需要一些工具函数,例如获取随机数、计时器、打印函数、重要常量(如最大值)等,由于每一个工程都自己手动实现一个实在是太傻,我将其总结放入一个文件中。.........
2022-07-09 10:33:31
736
原创 C++高效集合数据结构设计
在复杂算法实现过程中我们经常会需要一个高效的集合数据结构,支持常数级别的增、删、查,以及随机返回、遍历,最好还能够支持交集、并集、子集操作
2022-07-04 16:09:24
843
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅