- 博客(186)
- 收藏
- 关注
原创 并发编程中的锁与原子操作对比
悲观锁做事比较悲观,它在处理并发的时候,总是假设最坏的情况会发生,所以每次操作数据的时候都会先加锁,防止别人修改。比如在数据库里,可能用select for update这样的语句,或者Java里的synchronized关键字。这样做的优点是安全,因为一旦锁住了,其他线程就不能访问,避免了冲突。但缺点就是性能问题,因为加锁解锁需要开销,而且如果锁的时间长,其他线程就得一直等待,影响效率。互斥锁、自旋锁、读写锁,都是属于悲观锁。
2025-04-19 12:56:45
686
原创 C++11中的std::condition_variable
是C++11标准库中提供的线程同步工具,用于在多线程环境中实现“等待-通知”机制。它的核心作用是让线程能够高效地等待某个条件成立,避免“忙等待”对CPU资源的浪费。。当一个线程需要等待某个条件时,它会释放互斥锁并进入阻塞状态;当其他线程修改了条件并发出通知时,等待的线程会被唤醒并重新获取锁,继续执行后续操作。
2025-04-18 20:07:42
353
原创 C++ 三法则与五法则
在C++中,资源管理(如动态内存、文件句柄、网络连接等)是开发者的核心责任之一。如果处理不当,轻则导致内存泄漏,重则引发程序崩溃。本文将通过一段典型问题代码,引出三法则(Rule of Three)和五法则(Rule of Five)的核心思想,并探讨现代C++中的最佳实践。MyData 这个类看似完美,但当发生拷贝时…这段代码的致命问题在于:1️⃣浅拷贝导致两个对象共享同一块内存,析构时触发double free。2️⃣未遵循三法则,拷贝行为未正确管理资源。
2025-04-17 09:30:00
386
原创 C++面试八股文:智能指针
回答:智能指针是用于管理动态分配的内存,行为类似于指针,但又具有自动管理内存的能力,所以称为智能指针。auto_ptr和unique_ptr,它们都是独占式指针,同一时间只能有一个指针拥有所有权。auto_ptr是c++98引入,unique_ptr是c++11引入,替代了auto_ptr。auto_ptrauto_ptr的拷贝构造函数和赋值运算符会转移资源的所有权,导致原指针变为nullptr。这种隐式所有权转移在代码中难以察觉,容易引发逻辑错误。unique_ptr:C++11 的unique_ptr。
2025-04-16 20:15:49
628
原创 OpenGL之纹理
纹理采样是一种常用的图形学技术,通过从纹理图片中获取颜色值来增强物体表面的细节和真实感。纹理采样的基本原理是通过二维坐标系(UV坐标)获取贴图对应位置的颜色值。UV坐标的取值范围是 [0,1],表示了贴图上的相对位置。例如,UV 值为 (0.5,0.5) 时,采样到的就是贴图中心点的颜色值。
2025-04-09 13:00:38
889
原创 OpenGL中EBO的使用及原理
在OpenGL中,EBO(Element Buffer Object),也称为索引缓冲对象 IBO(Index Buffer Object),是一种用于存储顶点索引数据的缓冲区对象。它的核心作用是通过复用顶点数据来减少重复顶点的存储和传输,从而优化渲染性能。
2025-04-01 20:29:40
650
原创 GLSL(OpenGL 着色器语言)基础语法
✅GLSL语法类似 语言,但更适合GPU并行计算。✅顶点着色器主要进行坐标变换。✅片元着色器主要计算像素颜色。✅变量修饰符 in、out、uniform 控制数据流。✅向量、矩阵 计算是GLSL 的核心,优化GPU性能。
2025-03-30 21:40:36
1319
原创 QOpenGLWidget的使用:绘制三角形
所有 OpenGL 资源(VBO、VAO、Shader)都是 先创建 → 再绑定 → 配置 → 解绑 → 使用时重新绑定 → 释放,大致流程如下:首先要了解,VAO(顶点数组对象)和 VBO(顶点缓冲对象)是 OpenGL 里用于管理顶点数据的两种不同对象。简单来说:VBO(Vertex Buffer Object) : 是一个 GPU 缓冲区,存储顶点数据(如坐标、颜色、法线等)。如果只 bind() 了 VBO,OpenGL 还不知道数据怎么解析。
2025-03-30 18:12:32
575
原创 快速排序(C++实现)
通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字都比两一部分记录的关键字小,则可对这两部分记录进行排序,以达到整个序列有序。对各子表重新选择中心元素并。的元素一律前放,比他。的元素一律后放,形成。,直到每个子表的元素。
2024-11-28 22:33:02
359
原创 单例模式4种实现方式C++
假设在reorder的情况下:线程1走到赋值,但还没调用构造的阶段,而线程2进来判断m_instance,此时它已经被复制 所以不为空,这时候线程2就直接返回m_instance,但事实上它还没构造出来……因为编译器优化,指令的执行顺序可能reorder(CPU执行指令的层次,而且线程是在指令层次抢时间片的) ,可能变成这样:分配内存->赋值->调用构造(理想应该是:分配内存->调用构造->赋值)这样,编译时在编译的时候就知道,这个变量的整个赋值过程不能reorder,需要按照常规的流程走。...
2022-08-21 11:41:39
1199
原创 navicat远程连接不了阿里云服务器上的mysql
第一步:在阿里云服务器中开放3306端口第二步:修改配置,bind-address改为0.0.0.0第三步:登录mysql修改系统表user最后添加远程访问权限use mysql;Grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;flush privileges;还不行,重启一下mysql服务:service mysql restart...
2022-05-29 17:45:43
980
原创 Sqlite的rowid
sqlite3的每个表都有一个隐藏列:rowid,是一个64位的整数select rowid from table如果你在表中设置了主键(integer类型),此时,主键即rowid(也可以叫索引)使用rowid查询一般速度都会比较快rowid的一些规则:(1)从1开始,自增长的(2)在取值范围内,每次都比记录的最大rowid + 1(3)超出范围,随即在之前删除的rowid中选取一个使用场景:假设表中有一个主键列,执行insert语句时,想使用rowid(和rowid的规则)作为主键使用
2022-05-17 22:40:48
2743
原创 QList原理
QList不同于std::list,QList根据容易元素类型的不同,采用不同的数据结构来处理,从而节省内存、提高效率。QList的模板参数T大概分为两种情况:(1)如果T占用的内存较多 或 T占用内存少但有构造函数QList将每个元素存放在堆上,再维护一个指针数组,指向这些元素。所以可以根据索引快速查找元素,但删除操作速度较慢。(2)如果T是一个指针类型 或 T所占字节数小于指针所占字节数QList将T直接存放在指针数组中...
2022-04-10 16:17:25
855
原创 c++11 智能指针shared_ptr、weak_ptr
1、概述shared_ptr:强智能指针,可以改变资源的引用计数weak_ptr:弱智能指针,不会改变资源的引用计数2、问题强智能指针相互循环引用问题,会导致内存泄漏,如下:解决方法定义对象的时候使用强智能指针,在引用对象的地方使用弱智能指针...
2022-03-13 22:36:43
3433
原创 c++11 lambda表达式底层
lambda表达式也叫匿名函数或闭包,如果这个函数只使用不频繁,或者是不想起名,可以使用匿名函数。lambda式可以临时制作出回调函数、接口适配函数或语境相关函数的特化版本以供一次性使用。// 闭包可以复制 auto fun = [ capture_list ](parameter_list) -> return type {
2022-03-13 16:57:48
1988
5
原创 Qt事件处理机制
1.Qt事件简述Qt的事件主要分为两种:操作系统产生Qt应用程序产生首先,所有的Qt事件均继承抽象类QEvent,其描述程序内部或外部发生的动作。任意的QObject对象都具备处理Qt事件的能力。在发生事件时,会产生一个QEvent对象,这个对象会传递给当前组件的event( )函数。如果当前组件没有安装事件过滤器,则会将QEvent对象发放到相应的xxxEvent( )函数中。不同的QEvent对象会有各种各样的属性,比如:鼠标按下的属性So,总体的流程如下:Qt的main() 函数
2022-02-20 21:25:57
2052
原创 SQL基础知识笔记整理
一、检索数据select1.检索单个列2.检索多个列3.检索所有列4.检索不同的行:select distinct 字段1 from 表名select distinct 字段1,字段1,字段1 from 表名select distinct * from (错误)5.限制结果:select * from 表名 limit 5 #返回不多于5行select * from 表名 limit 5,3 #返回从行5开始的3行(行索引从0开始)6.完全限定的表名二、排序检索数据orde
2021-09-28 00:15:21
1345
原创 Qt设置文本省略样式
void ZqyFunctionConfigWdt::setLabelElidedText(){ QString text = ui->label->text(); QFontMetrics metricsLabel(ui->label->font());//比较文本的长度和控件的长度,如果文本长度大于控件的长度 if(metricsLabel.width(text) > ui->label->width()) { //
2021-07-30 22:18:32
649
原创 Qt动态样式
如果想要一个控件在不同的情况下使用不同的样式,一般直接setProperty是没有效果的。需要在setProperty后再加上unpolish和polish刷新一下,顺序不能反。ui->label->setProperty("lbStyle", "red");ui->label->style()->unpolish(ui->label);//删除旧样式ui->label->style()->polish(ui->label);//设置新样式
2021-07-30 22:13:02
582
原创 Qt中QTimeEdit、QDateEdit、QDateTimeEdit样式表
1.1 QTimeEdit 样式表效果图:qss代码:.QTimeEdit[timeEditStyle="commom"]{ min-height:24px; max-height:24px; border-radius:2px; border:1px solid #cccccc;}.QTimeEdit[timeEditStyle="commom"]:hover,.QTimeEdit[timeEditStyle="commom"]:focus{
2021-07-30 22:04:24
8069
1
原创 力扣136.只出现一次的数(异或运算)
异或是一种逻辑运算,相同为0,不同为1。在C++语言中,使用 ^ 符号表示异或运算符。异或运算的时候只能使用二进制位运算,所以需要先将十进制位转换成二进制位。力扣136 只出现一次的数给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?方法1、暴力法(时间复杂度O(n^2))方法2、哈希法(时间、空间复杂度均为O(n))方法3、排序法(时间复杂度O(nlg(n)))方法
2021-07-26 22:03:19
252
原创 Qt setMouseTracking函数的作用
设置窗体是否追踪鼠标this->setMouseTracking(true);//默认值为false该函数默认是不追踪的,不追踪的情况下 : 至少有一个鼠标按键按下才会响应鼠标移动事件。那么如果你在鼠标悬停的时候就想响应鼠标事件(获取鼠标位置信息等)的话,就需要将函数设为true。...
2021-07-24 17:05:36
702
原创 TCP协议
面试常见问题怎么确保可靠性?停止等待协议和连续ARQ协议流量控制拥塞控制的方法?为什么要三次握手,而不是两次握手?为什么要四次挥手?为什么是2MSL?TCP特点TCP是面向连接的传输控制层协议。因为应用程序在使用TCP协议之前,必须先建立TCP连接;在传输数据完成后,必须释放已经建立的连接。TCP连接是点对点的。TCP提供可靠交付的服务。通过TCP连接传输的数据,无差错、不丢失、不重复,并且按序到达。TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TC
2021-03-31 21:36:43
1509
原创 三步问题(C++)
题目描述三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。代码实现解法1//时间复杂度o(n) 空间复杂度o(n)class Solution {public: int waysToStep(int n) { vector<int> dp(n+1,0); if(n<3) return n;
2021-03-28 20:07:54
550
原创 746 使用最小花费爬楼梯(C++)
题目描述数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。思路只要在当前位置的前两个中选择一个最小值+当前位置的值,就是每个阶梯所花费的最小值代码实现class Solution {public: int minCostClim
2021-03-28 19:19:11
316
原创 青蛙跳台阶的问题(C++)
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。思路首先定义一个数组记录那些需要重复计算的值然后找出数组之间的关系式找出初始条件代码实现int numWays(int n){ if(n<=1) return n; int dp[n+1]; // 定义一个数组记录重复使用的数据 dp[
2021-03-27 17:39:00
767
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人