- 博客(22)
- 收藏
- 关注
原创 C++的loadAcquire 与 loadRelaxed
正如我们之前强调的那样,避免在并发中使用锁,在迫不得已时可以使用std::atomic,而想要用好std::atomic又是另一个富有挑战性的故事了。此时,初始化线程在完成后应使用 storeRelease 存储标志,其他线程使用 loadAcquire 读取标志,确保看到初始化的完整效果。正确选择内存顺序对于有效的并发控制至关重要。在这个例子中,loadAcquire 确保了所有在标志设置为 true 之后的读取操作都能看到 SomeResource 的初始化状态,防止了潜在的数据竞争。
2025-03-14 11:30:00
290
原创 针对Qt的setParent函数的研究
当然,对于简单界面的创建,不必过度强制推行这种形式,更不建议过早优化,因为这种方式带来的提升是有限的,这里创造的价值不值得我们为此推行一个新的规则。而对于复杂界面的创建,则可以参考这里的建议;在研究这里的创建细节时,我们发现我们的创建性能仍有很大的优化空间。由于目前的样式表过于复杂,导致在添加Widget时解析样式耗时过长,这块平台正计划进行系统性的性能优化。例如,往已经显示的QWidget添加控件时,可以考虑创建完后添加到界面树中,相比自顶向下依次创建,大概能提高10%~20%的性能。
2025-03-13 14:48:51
348
原创 C++的std::string_view有什么用
std::string_view 指向 std::string 的内部数据时,必须确保 std::string 在 std::string_view 使用期间不会被销毁或修改(例如通过重新分配内存),否则 std::string_view 可能会引用无效的内存,在一些性能关键的场景,灵活使用std::string_view能够带来极大的性能提升,string_view特性给字符处理库提供了安全的、高性能的字符串底层工具(如编译器、字符串解析库等),然而在我们业务里则很少需要用到。
2025-03-13 14:35:27
248
原创 Qt知识点 —— Qt的Attributes
9. Qt::AA_ShareOpenGLContexts:在支持OpenGL渲染的Qt应用中,设置此属性意味着在同一进程内的多个窗口之间共享OpenGL上下文,以提高性能和资源利用率。8. Qt::AA_SetPalette:这个属性并不直接对应于Qt中的一个具体应用属性,但从概念上讲,它可能是指通过调用QApplication::setPalette()来全局设置应用程序的默认调色板的行为。在早期版本的Qt中,调色板对于定制控件外观非常重要,但在现代Qt版本中,使用样式表(QSS)更为常见。
2025-01-28 23:15:00
1411
原创 多线程和锁 : 美丽的陷阱
了解这些条件并设计避免它们的策略。4. 不要在持有锁时调用未知的代码【重要】:调用你不完全控制的代码,尤其是回调或虚函数,可能会导致死锁或其他意外的并发问题。2. 始终以相同的顺序获取多个锁【重要】:如果需要同时持有多个锁,确保所有线程都以相同的顺序获取它们,这可以避免死锁。1. 最小化锁的范围【重要】:只在必要时持有锁,并尽可能减少持有锁的时间,以减少线程争用和提高并发性能。3. 避免嵌套锁(如果可能)【重要】:尽量避免在持有一个锁的情况下获取另一个锁,因为这增加了死锁的风险。
2025-01-27 16:45:00
355
原创 在软件开发的生命周期中,性能问题的解决时机至关重要
开发者在编写和重构代码时,能够从源头上避免潜在的性能瓶颈,将性能优化融入到产品的内核之中,既能减少测试人员工作量,还能确保功能在上线时就能具备良好的性能表现。但是,这些是辅助手段,用来 预防和兜底 开发者在设计之初对性能的欠缺考虑以及没有关注性能表现的问题,不是解决性能问题的主要手段。在阶段越往前的时机解决性能问题:影响面越小(更少用户受影响),定位成本越低(牵扯人员越少),定位效率越高(解决问题快)。这两点意识就如同我们强调的关注编译Warning是一样的,是开发组提高开发素养和开发质量的必经之路。
2025-01-26 13:30:00
195
原创 什么是防御性编程
在一个复杂多变的软件环境中,防御性编程的重要性不言而喻,它能够有效地预防错误,减少系统崩溃,并提高用户体验。这样在开发者编写出误用的代码或不合适的代码,可以即使被发现和修正,提高了整体的研发效率和研发质量。4、考虑限率:对于用户点击触发大量运算或者耗时操作,或者对于后台推送触发大量数据刷新的逻辑,都需要有自适应和限制频率的逻辑确保软性运行不会出现因卡顿导致的雪崩。3、养成逻辑完备的编程习惯:养成思考所有可能性的习惯,认真写好错误处理,编写逻辑完备的代码。6、输入验证:所有的用户输入都不应被信任。
2025-01-23 15:30:00
314
原创 深入理解并灵活运用C++中的lambda表达式(匿名函数)
C++经历了多个版本的迭代,其中C++11标准引入的lambda表达式无疑是对现代C++编程风格影响深远的特性之一。C++中的lambda表达式本质上是一个匿名的函数对象,它可以捕获作用域内的变量,在捕获列表中,lambda可以捕获外部作用域中的变量,使得这些变量在函数体内可用。在捕获对象时,需要特别需要关注捕获对象的生命周期和内存安全。C++官网对Lambda表达式的解释:https://en.cppreference.com/w/cpp/language/lambda。
2025-01-22 14:45:00
194
原创 什么是 clang-format ?
这个文件通常与Clang-Format工具一起使用,后者是LLVM项目中的一个工具,用于自动格式化C、C++、Objective-C代码。Clang-Format工具可以作为命令行工具单独使用,也可以集成到各种文本编辑器和集成开发环境(IDE)中,如VisualStudio、Xcode、Vim、Emacs、Atom和SublimeText。通过使用.clang-format文件,开发团队可以为其项目定义统一的代码风格,这样所有参与项目的开发者都能自动地按照相同的标准格式化代码。
2025-01-21 13:45:00
204
原创 什么是C++常量表达式
随着 C++14 和 C++17 的推出,对 constexpr 的支持有了进一步的扩展,如允许 constexpr 函数使用更多的标准库函数、支持 if constexpr(C++17)等。C++11 中出现了一个新的关键字 constexpr,这个关键字用于声明变量、函数、构造函数和类模板的实例化为常量表达式(constant expressions)。既可以用于对象声明,以保证对象的值在编译时是已知的,也可以用于函数,以保证函数在给定编译时已知的参数时能够返回一个编译时已知的结果。
2025-01-20 17:30:00
205
原创 项目编译速度的重要性
如果编译过程缓慢,它将成为瓶颈,延迟反馈循环,使得及早发现和修复缺陷的过程变得更加困难。此外,编译速度直接影响到软件发布的周期,过长的编译时间可能推迟产品的上市时间,影响竞争力。长时间的编译过程不仅耗费宝贵的开发时间,而且影响开发者的工作流程和生产力。开发者在等待编译完成时可能会分心或失去工作中的连续性和深度专注,这不利于维持高效率和高质量的代码编写。通过这些措施能显著减少等待编译完成的时间,提升开发效率,从而在激烈的市场竞争中占据优势。因此,在大型C++项目中,采用多种策略来优化编译速度是非常重要的,
2025-01-19 16:15:00
144
原创 C++的RTTI
而虚函数的存在意味着每个对象需要携带额外的信息(如v-table指针),这为RTTI的实现提供了必要的信息基础。不少人说,C++的RTTI(Runtime Type Information)的性能不行,或者dynamic_cast的性能不行。:这种行为是通过虚函数表(v-table)来实现的,每一个多态类都有一个v-table,其中包含了指向类的虚函数的指针。在技术上,要多问为什么,敢于挑战权威,深入思考问题的根本,切记不可人云亦云,滥竽充数。事实上,C++的RTTI的性能可以满足几乎一切的应用开发场景,
2025-01-18 11:45:00
363
原创 Qt中最基础的设计模式:私有实现(Private Implementation)
宏Q_D和Q_Q是Qtpimpl设计模式的体现。pimpl模式是一种常见的设计模式,用于隐藏一个类的实现细节,从而减少编译依赖和提高封装性,达到提高编译速度和增加二进制接口的稳定性的目的。所以,Q_D宏用于获取(Query)指向私有数据(PrivateData)的指针,而Q_Q宏用于获取(Query)指向公共接口(QtPublicInterface)的指针。深入了解和掌握Qt的piml设计模式,是打开Qt代码宝藏的第一步,希望你会热爱并探索Qt这片繁茂的技术知识森林。
2025-01-17 19:52:10
336
原创 Visual Studio 的C++性能分析工具
开发团队应将性能视为核心质量指标之一,在自测阶段对性能情况具有良好的把控,而非仅仅作为发布前的检查项。:在开发阶段考虑性能可以引导开发出具有良好架构的软件,这样的软件更易于维护和扩展。而在发布后解决性能问题往往需要更多的权宜之计,这可能会牺牲代码的清晰性和未来的可维护性。实际上,性能问题应当在开发阶段就被重视并解决,并且在开发阶段也是最容易解决的阶段。掌握并熟练运用VS性能分析工具能帮助我们在开发阶段就彻底解决性能问题。:在开发阶段优化性能可以提前发现和修复可能导致失败的缺陷,减少发布后的风险。
2025-01-17 11:37:02
345
原创 Qt中好用的定时相关工具类
QTimer与Qt的事件循环结合紧密,定时器超时时会发送一个信号,你可以将这个信号连接到任何槽函数,以执行你需要的操作。QTimer的关键方法和信号包括:start(int msec):启动或重新启动定时器,并设置超时时间,单位是毫秒。stop():停止定时器。QElapsedTimer的主要方法包括:start():重新启动计时器。restart():重新启动计时器,并返回自上次启动以来经过的毫秒数。这个类可以用来等待一个特定的时间点,或者检测是否超时,或者与其他的时间相关的函数一起使用。
2025-01-14 19:43:45
171
原创 算法二:堆排序
//堆排序,其复杂的为nlog(n)#include <iostream>using namespace std;//交换数组下标为i,j的元素void Swap(int tree[], int i, int j){ int temp = tree[i]; tree[i] = tree[j]; tree[j] = temp;}//堆化,将数组转化为大顶堆 如:...
2020-04-13 13:42:14
144
原创 算法一:八皇后问题(递归解法)
//八皇后问题,在8*8的棋盘上放8颗棋子,任何两颗棋子不能同行同列和同对角线/*思路: 1、Success(int k, int w)函数,探测第k行、第w例是否允许放入棋子(不与已放棋子在同行同列同对角线)。 2、Queue(int row),从第row行开始检测。如果第row行某个位置满足条件,则继续检测第row+1行,如果第row行没有一个位置满足条件,则撤回row-1行的...
2020-04-10 02:14:54
351
原创 基于epoll的简单http服务器
最近,学习了一下epoll函数,于是写了一个简单的http服务器。代码如下:#include <sys/socket.h>#include <sys/wait.h>#include <netinet/in.h>#include <netinet/tcp.h>#include <sys/epoll.h>#include <...
2020-03-22 02:25:14
381
原创 C++ 条件变量 生产者消费者模型
基于C++的condition_variable实现的生产者消费者模型,main函数中创建两个线程(生产者和消费者),生产者随机生成一个数字并push_back进容器,消费者则从容器中pop_back一个数,当容器没有数据时,消费者线程挂起,等待生产者线程生产数据并唤醒消费者线程。#include <iostream>#include <thread>#include...
2020-03-09 02:30:04
1033
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人