- 博客(392)
- 资源 (25)
- 收藏
- 关注
原创 记一次表格数据排序优化(二)--std::sort + 运行模式光速排序
2 抛开排序之前的预处理遍历不谈,自写的冒泡算法在cache-miss上没有做任何考虑。std::sort在这方面可能也有所优化。沿着前面博客的思路,现在用std::sort代替自己写的冒泡算法。1 sort函数的复杂度是O(nlog(n)),而冒泡算法的复杂度是O(n^2)这里只修改了类ModelFreqDetect。在运行模式下测试,几乎没有任何卡顿。
2025-04-06 14:20:10
162
原创 记一次表格数据排序优化(一)--排序30000条数据有多卡
1 我的qt程序通过表格显示30000条数据。数据来自udp,udp每隔10秒发一次,一次含两个包。每包含有15000个数据。2 每条数据有三个属性,在表格中通过3列显示这三个属性。其中一个属性是区分“左”和“右”的。udp发送的两个包,一个包全是“左”属性,另一个包全是"右"属性。3 当用户点击三列中某一列的表头时,触发程序针对该列对应的属性进行排序。排序又分升序和降序。假如某列上一次使用升序排列,那么当用户再次点击该列表头时,该列变为降序排列。
2025-04-05 23:55:45
439
原创 MV结构下设置Qt表格的代理
所谓MV结构,是“model-view”(模型-视图)的简称。也就是说,表格的数据保存在model中,而视图由view实现。在我前面的很多博客,如我已经花了很多笔墨描述Qt表格的软件设计方法。在本篇文章中,我将介绍如何编辑表格--表格代理。
2025-01-28 16:45:50
1290
原创 第一次使用address sanitizer记录
显然,delete 释放的首地址不对,比真正的首地址偏了一字节。于是,asan报错(上图绿色文字): 1 bytes inside of 10-byte region,并指出了错误发生的位置(紫色线标出的文字):main.cpp:6即main.cpp第六行。平台:中标麒麟,gcc 4.9.3。
2024-12-15 14:36:19
131
原创 源码编译glibc2.18过程记录
在某些操作系统里,libc.so.6没有debuginfo,影响我使用valgrind/systemtap调试。为此,我决定用源码编译一个与当前已有的libc.so版本相同的libc.so.6,并附带debuginfo。以下是过程记录。
2024-12-12 18:35:49
364
原创 理解原子变量之四:可见性、memory_order_acquire与 memory_order_release
则b线程读取该原子变量后,不仅可以看到该原子变量的更新值(也就是a线程写入的值),还能看到a线程对该原子变量进行写入之前的所有其他的写操作的效果,不论是针对该原子变量的,还是针对其他变量的,也不论这些变量是不是原子变量,也不论使用何种内存序。里的实例3里面,我们看到,如果在一个线程里修改原子变量done,另一个线程读取done时,就会看到这个变化。这就是原子变量的可见性。1 a线程对某原子变量进行了写入操作,且使用了内存序memory_order_release,最重要的是红线标出的这句话。
2024-11-23 18:51:33
433
原创 理解原子变量之三:原子性与memory_order_relaxed
在一位C++大神 “高效程序员” 的公众号里,有这么一篇文章介绍原子变量《C++11开发中的Atomic原子操作》。里面有这么一段话:“...原子操作,基本都包含...三个方面...的语义:操作本身是不可分割的(Atomicity),一个线程对某个数据的操作何时对另一个线程可见(Visibility),执行的顺序是否可以被重排(Ordering)”。Atomicity翻译过来就是原子性,Visibility翻译过来就是可见性。本文在前面两篇文章的基础上,进一步讲述原子性的含义。
2024-11-23 14:55:34
341
原创 源码编译安装perf
本文介绍如何通过源码编译的方式实现perf的安装。依赖安装完毕后,make clean,然后从新make perf。7 编辑~/.bashrc,在.bashrc的PATH加入/usr/local/bin。6 make结束后,将产生的perf拷贝到/usr/local/bin。在make过程的一开始,可能会检查依赖的情况。如下图所示,这里面,9 检查perf版本,有输出则安装成功perf --version。对于中标麒麟,虚拟机,版本是linux-4.4.13。,通过elfutils安装,参考我的博客。
2024-11-14 22:08:52
599
原创 理解原子变量之二:从volatile到内存序-进一步的认识
实例1,2,3都是在vs2013下演示的。即使遵循相同的C++标准,不同的编译器对同一个标准的贯彻程度也不一样:有的编译器严格遵循标准,既不多做,也不少做;对照实例1,在不使用volatile的情况下,子线程workerThread对done的修改,没有影响到主线程的while(!编译器意识不到子线程也在改变done的取值,所以就认为done是常量,而不会在运行到while()时读取done的实际值,于是while(!反观实例2和3,子线程修改了done,主线程的运行随之受了影响,这就是可见。
2024-11-03 11:30:09
1045
原创 理解原子变量之一:从互斥锁到原子变量,最粗浅的认识
多线程编程对于程序员来说,是一项非常重要的技能。在C++11标准问世之前,C++标准是不支持多线程的。在C++11出台前,如果你想在linux平台进行多线程编程,就要使用linux的多线程库pthread,而pthread是按照POSIX标准实现的,与C++标准无关。在C++11标准下,你可以使用std::thread,实现多线程编程。但是,多线程编程涉及的不仅仅是thread,编程者也要考虑资源竞争的情形,这就涉及到互斥锁、信号量等。这些也包含在c++11中。
2024-11-01 13:34:34
862
原创 初尝类型萃取--typename、模板偏特化、和traits之(三)类型萃取
本文作者在看过公众号《C++学习与探索》的文章《【一分钟学习C++】萃取机制》后,对类型萃取(type_traits)有了初步的认识,所以写下这篇博客。《【一分钟学习C++】萃取机制》门槛较高,如果没有理解typename和模板偏特化,是难以理解该文意思的。本文以及前面的两篇文章(初尝类型萃取--typename、模板偏特化、和traits之一、二)目的是将萃取涉及的基本知识点,如typename、模板偏特化先讲清楚,然后通过讲解例子的方式,使得类型萃取能被更多读者理解。
2024-10-17 20:32:16
1040
原创 CMake学习笔记(四)cmake --build使用踩坑记录
将在目录中产生结果文件。但是实测发现,这里有坑:如果CMakeCache.txt等文件没有产生在中的话,cmake --build 将报错。只有先在目录下执行cmake ..,使得CMakeCache.txt产生在中,cmake -build 才能起作用。编译结果最终产生在build目录下。
2024-10-10 19:39:05
1629
原创 如何在Android Studio中找到CMakeLists.txt的打印信息
的描述,MESSAGE函数打印的STATUS级别的信息在android studio中是看不到的。所以采用WARNING级别打印。下面使用android studio 2023.2.1打印信息。
2024-10-09 22:06:03
512
1
原创 安卓真机调试“no target device found“以及“ INSTALL_FAILED_USER_RESTRICTED“两个问题的解决办法
使用android studio 2023.2.1.23windows版本。手机为小米K70 Pro。
2024-10-03 08:46:21
1448
原创 wireshark使用要点
但是实测wireshark发现,tcp[0:X], tcp[19:X], tcp[21:X]...等过滤效果都一样。ip.addr == XXX.XXX.XXX.XXX显示消息源地址为XXX.XXX.XXX.XXX,或者消息目的地址为XXX.XXX.XXX.XXX的信息。ip.dst == XXX.XXX.XXX.XXX 只显示消息目的地址为XXX.XXX.XXX.XXX的信息。ip.src == XXX.XXX.XXX.XXX 只显示消息源地址为XXX.XXX.XXX.XXX的信息。
2024-09-25 19:02:32
690
原创 比较stl库的ostringstream与Qt的QString::arg(),QString::number()
对于stringstream,使用比较繁琐,要联合使用std::fixed和std::setprecision才能实现固定小数位数显示,qstring则要简单一些。注意,使用qstring的时候,不论使用arg还是number,format输入参数都必须是'f',不能用'g',否则可能无法获得理想的效果。考虑STL库的ostringstream或者Qt的QString::arg(), number。显示一个float或者double类型的数,要求小数点后的数字位数为定值。
2024-09-11 22:07:56
476
原创 std::map 合并
假如map2的某些键也出现在map1里面,则map1中重复的键值对不变,map2中重复的键值对无法覆盖map1。采用insert函数实现两个map的合并。
2024-09-10 17:30:42
244
原创 std::bind与std::ref配合使用时要注意的几个问题
在前面的博客,我们看到假如std::bind的输入函数的输入变量是引用类型,则我们可以在std::bind中用std::ref修饰它们。
2024-06-23 15:52:46
301
原创 浅析std::ref
根据等消息来源的描述,需要std::ref的场景主要是如下三种:假如std::thread需要调用一个函数,且这个函数的输入参数是引用的话,则std::thread对这个参数的调用必须用ref修饰。假如sid::bind需要调用一个函数,且这个函数的输入参数是引用的话,则std::bind对这个参数的调用必须用ref修饰。stl库调用,比如for_each的输入参数里也可以有一个函数指针。假如这个函数的输入参数是一个引用,则函数指针也要用std::ref修饰。下面通过几个实例来验证以上描述的真伪。
2024-06-23 15:31:13
1126
原创 CMake学习笔记(三)区分macro与function
因为macro的set(in "2")又定义了一个新的变量in,并赋值2。在执行set(in "2")之前,message("in = "${in})的内容已经被替换成message("in = 1"),所以set(in "2")对后面的语句没有影响,仍然输出1。(事实上,set(in "2")把in当成了一个新的全局变量,后面还会提到)。这也是set(in "2")起作用的原因。可见,test(1)调用时,in = 1,但是set(in "2")随后将in 改为2.所以接下来打印in = 2。
2024-04-05 18:31:35
775
原创 理解pytorch的广播语义
1 两个tensor都至少有一个维度;2 两个tensor的维度个数要么完全一样,那个维度较少的tensor可以把自己缺少的维度补充为1;3 补齐可以补充多个维度,但是只能发生在所有已有维度的左边,不能插在已有维度之间,也不能出现在已有维度右边。4 假如运算是原位运算,则保存运算结果的变量的尺寸不应在运算前后发生变化。
2024-04-04 11:07:00
1471
原创 CMake学习笔记(二)从PROJECT_BINARY_DIR看外部编译和内部编译
1 从哪个路径执行cmake命令,变量PROJECT_BINARY_DIR就等于这个路径2cmake产生的中间文件、结果文件都保存在与CMakeLists.txt一起的路径下,这叫做内部编译。反之,两者分开的,就是外部编译。3 ADD_SUBDIRECTORY的第二个输入参数指定了cmake产生结果文件的保存路径。假如不指定这个输入参数,则用来存放编译结果的文件夹就是${PROJECT_BINARY_DIR};
2024-03-26 22:14:43
1250
原创 CMake学习笔记(一)一个最简单的CMakeLists嵌套示例
这里,src文件夹需要稍后手动建立,因为在cmake之前,src里面要放进去源码。但是bin文件夹不需要手动建立,因为cmake过程中会自动建立bin。bin用来存放编译产生的结果文件。bin只是习惯的名称,你也可以换个名字,如bin1。这里顺便讲一下ADD_SUBDIRECTORY的用法它的第一个输入参数是用来存放源代码的文件夹,第二个参数是用来存放编译结果的文件夹。第二个参数可以输入,也可以不输入。
2024-03-26 21:00:12
835
原创 torch.multinomial()函数用法
在OpenAI联合创始人Andrej Karpathy的教程中,提到了函数torch.multinomial()。
2024-03-24 14:08:30
1482
原创 pytorch如何向tensor结尾添加元素或维度--torch.cat()、torch.unsqueeze()的用法
0意味着新元素4将沿着1,5,0的方向连接下去。所以增加的是[[4,4,4]],而不是[4,4,4]。原来p是沿着1,5,0 ----->增加的,这是p唯一的维度。unsqueeze之后,[1,5,0]成为p的第一个元素,下面可以再增加一个三元tensor,接在[1,5,0]后面。p--p含有三个变量,而torch,Tensor([4])显然只有一个变量。如下图,q已经是2行3列的tensor了,但是还可给它添加1行3列的[4,4,4]增加[4,4,4]:(注意,这里加入的其实是[[4,4,4]])
2024-03-24 11:05:56
3656
原创 总结python sorted函数对list、dictionary和tuple排序的行为
sorted函数默认采用升序排列,即是说,“值比较小”的排在前面。在这个原则下,sorted函数对数字和字符串的排列行为都不难理解。假如被排序的容器,其元素不是简单的数字或者字符串,而是复杂的容器,如list dictionary或者tuple,排序行为是什么样的?
2024-03-23 21:02:51
770
原创 python 的zip函数的用法
zip在英语里的意思是拉链。想象两个列表(或任何可迭代的容器),a和b。两者各自有若干元素。zip返回值也是一个容器,容器的每个元素都是一个二元元组(tuple)。如下所示:这个结构像是现实中的拉链一样,所以叫zipzip具有如下性质:zip的返回值含有的元素个数与较短的输入容器相等。
2024-03-07 13:01:45
492
原创 linux(阿里云)安装pytorch
ubuntu22.04已经预装了python 3及pip。阿里云 ubuntu 22.04 UEFI版 64位。1 检查python3和pip3是否已经安装。3 安装完毕,检查pytorch版本。2 安装pytorch。
2024-02-15 17:31:50
934
原创 Linux源码编译python3(以及必要的依赖包libffi)
安装完成后,libffi.so安装在/usr/local/ib中。由于银河麒麟已经预装了python2.7,所以要把新的python与旧的区别开。的说法,解决办法是安装libffi。下面通过编译源码安装libffi。确认/usr/local/lib出现在ld.so.conf中。完成这一步,你就可以看到python3的版本号了。6.6.1 建立python3的软链接。6.6.2 建立pip3的软链接。6.2 解压,并进入解压后的路径。2 解压源码,进入解压的路径。1 下载python3源码。
2024-01-20 17:39:25
2586
基于qt的程序,演示了如何通过setStyleSheet配置checkbox按钮的外观。
2022-06-25
DXSDK 2010 Redistribution 32位 2010 Redistribution 64位
2022-04-23
assimp 3.1.1的源码以及 用vs2013, vs2019分别编译产生的dll和lib(64位)
2022-04-23
定制QWidget标题栏的示例,并含有qss配置QTabWidget样式的示例
2022-04-10
release.rar
2020-02-27
CVIEW显示灰度图示例
2018-11-25
基于opengl的曲线绘制示例
2018-10-15
mfc写入xls文件示例
2018-09-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人