
C++
文章平均质量分 71
崔杰城
C++开发工程师
展开
-
Shedskin 使用
Shedskin是一个编译器工具,可以将Python代码编译为C++语言。如果我们的电脑是Ubuntu20.04,则其自带的python为3.8版本,我们下载。但抱着学习的心态我们还是可以学习使用该工具的。下面以最简单的Hello world为例子进行演示。执行命令shedskin后,看到输出如下,表示安装成功了。执行./test ,可以看到输出了Hello,World!执行完后,即会生成test.cpp等C++文件。然后执行make,就会生成C++的可执行文件。(注意:不要下载新版本的,比如。原创 2023-07-24 22:24:05 · 759 阅读 · 0 评论 -
使用vector<char>作为输入缓冲区
实现网络接收、读取文件内容等功能时,首选vector作为输入缓冲区。原创 2023-02-19 19:21:17 · 3181 阅读 · 1 评论 -
vscode调试C/C++程序时报错:Program received signal SIGINT,Interrupt.0x...... in epoll_wait
使用vscode调试C/C++程序时报错:“Program received signal SIGINT,Interrupt.0x...... in epoll_wait”。然后程序退出了。但是如果不调试,只是运行程序则不会退出。原创 2023-01-18 19:15:09 · 2116 阅读 · 0 评论 -
C++用unordered_map查表代替if else/switch case多判断语句
使用unordered_map查表操作代替if else/switch case语句,适用于判断分支非常多的场合。比如我们设计平台服务器,该服务器需要跟数十种不同类型的客户端/设备进行通信,涉及成百上千条通信指令。平台服务器接收通信指令后需要执行对应的回调函数,这个时候我们可以用unordered_map查表代替if else/switch case语句,来提高代码的可读性和维护性。原创 2022-12-11 15:27:46 · 1770 阅读 · 0 评论 -
json库 nlohmann/json 的基本使用
大概是目前使用最方便的跨平台json库了,其可以让用户以modern C++的方式解析和构建json。如果解析失败,比如要解析的json格式不正确,会进入catch (json::parse_error& ex)代码段里面,打印错误提示。例子3:构建json字符串,打印到控制台,并保存为json配置文件(output.json)例子2:读取并解析json配置文件(input.json)里面的内容,打印到控制台。例子1:解析std::string里面的json内容并打印到控制台。C++的json库有很多。原创 2022-12-10 19:11:37 · 4589 阅读 · 1 评论 -
C++优雅地开启/暂停/停止线程——基于观察者模式
在编程中经常需要创建子线程来执行耗时的任务,避免主线程卡死,提高程序性能。其中有很多业务场景需要我们可以自由控制子线程的开启/暂停/终止。比如音视频播放器,除了用来操作ui控件的GUI主线程外,还有音视频数据解封装线程、视频解码线程、音频解码线程。用户按下“播发”按钮要能开始播放视频(开启所有子线程),用户按下“暂停”按钮要能暂停播放视频(暂停所有子线程”,用户按下“停止”按钮要能结束播放视频(终止所有子线程)。针对这种业务场景我们需要有个机制:当用户按下某个按钮后,GUI主线程可以通知所有的子线程开启/暂原创 2022-12-05 01:05:56 · 2712 阅读 · 0 评论 -
VsCode + gdb + gdbserver远程调试arm嵌入式linux C/C++程序
基本流程跟我的另一篇文章《》一样,不一样的是需要重新编译gdb和交叉编译gdbserver。原创 2022-12-03 00:20:56 · 6884 阅读 · 3 评论 -
C++无锁队列concurrentqueue的使用和性能速度测试
由上面的例子可以看出,实现相同的功能,使用concurrentqueue比std::queue性能还要略强一点。而且concurrentqueue接口完善,封装程度更高,使用它后我们不需要再在代码中显式增加互斥锁和条件变量来进行同步了,使用更简单,可以使我们的代码可读性更好。生产者线程负责把数据入队列,消费者线程把数据出队列,为了保护临界资源,我们得加互斥锁。它的实现基于原子操作CAS,比大多数其它队列性能更强,而且使用更方便。》,下面用例子讲解该队列的使用,以及跟STL队列容器queue的性能对比。原创 2022-11-30 21:21:28 · 6241 阅读 · 4 评论 -
C++原子操作和互斥锁性能(速度)对比
执行时间是0.541秒,是耗时最短的,但是由于没有用互斥方法保护,所以临界资源n的值不正确(正确的值应该为0)。这是因为自增、自减操作不是原子的,编译得到的汇编指令可能会对应多条指令。可以看到耗时为:5.261秒,n的值为0。编写测试demo,开启两个线程,对全局变量n分别进行自增、自减操作,计算执行时间。所以对于基本类型的临界资源,我们进行访问时可以用原子操作代替互斥锁,来提高性能。执行时间最长,但也能保持临界资源n的值正确。先说结论:原子操作性能(速度)强于互斥锁,下面用例子进行说明。原创 2022-11-29 23:26:24 · 3266 阅读 · 0 评论 -
ofxTimeMeasurements——OpenFrameworks插件,可以轻松测量C++代码任何部分的执行时间
ofxTimeMeasurements是一款用于OpenFrameworks 开源C++框架的插件,可以让使用者轻松测量C++代码任何部分的执行时间。其优势在于以图形化的方式显示代码执行时间。效果如下:只是它必须依赖OpenFrameworks,所以如果你不用这个框架,还是推荐用我之前写的《》,来测量代码执行时间吧,那样更方便。原创 2022-11-29 15:05:20 · 988 阅读 · 0 评论 -
C++计算打印函数和代码块的执行时间(支持所有类型函数)
所以本文对此方法进行优化,通过万能引用 + 变长参数模板 + std::future 实现支持对 携带任意参数和返回值的函数进行测量。对于绝大部分情况,这种方式是足够了,但是缺陷也很明显:measure函数不支持带有参数的函数,而且无法打印函数的返回值。》讲述了一种衡量线程执行时间的方法。原创 2022-11-28 19:49:08 · 1657 阅读 · 0 评论 -
池式结构:对象池(Object Pool)
对象池:通过重新使用固定的池式结构中的对象,来代替单独分配和释放对象,可以提高程序的性能和内存使用。原创 2022-11-27 12:48:44 · 3059 阅读 · 0 评论 -
C++复制构造函数和移动构造函数的性能速度对比
C++11中引入了移动语义,用在资源频繁拷贝的地方。通过移动构造函数可以减少不必要的复制,带来性能上的提升。下面我们通过代码比较复制(拷贝)构造函数和移动构造函数的性能(速度)。可以看到使用移动构造函数Person(Person&& p) 速度比使用拷贝构造函数Person(const Person& p)快200多倍。原创 2022-11-26 08:42:30 · 1157 阅读 · 0 评论 -
C++线程池实现解析
)是一个用到C++11特性的跨平台线程池,可以在windows,linux上运行。其只用不到100行代码就实现了线程池的基本功能,麻雀虽小五脏俱全,非常适合初学者学习。本文对其源码进行分析。原创 2022-10-22 03:13:59 · 1659 阅读 · 0 评论 -
VScode调试C++代码时无法查看STL容器(string、vector等)
重新按F5启动调试,我们发现可以正常显示string,vector等STL容器的值了。如下图所示:用VScode调试C++代码时,无法显示我们想要的值。原创 2022-09-04 19:17:31 · 10448 阅读 · 16 评论 -
initializer element is not constant
如下图所示,编译C语言时出现报错:error:initializer element is not constant。第二种是升级gcc为v8.1以后的版本,这种方法优势是不用改代码。第一种是改代码,把全局变量改成定义成局部变量,可以参考:《原创 2022-08-23 22:58:22 · 5345 阅读 · 0 评论 -
Linux配置libevent开发环境
后,我们在/usr/local/include和/usr/local/lib已经可以分别看到libevent的头文件和库文件了。我们以里面的hello-world.c为例讲解libevent在linux下开发环境的搭建。在libevent解压后的源码目录的sample目录中,存放着官方提供的例子。在 /etc/ld.so.conf.d里面加上/usr/local/lib。把hello-world.c拷贝到我们工程目录。然后就可以运行我们编译出来的程序了。...原创 2022-08-18 07:31:15 · 193 阅读 · 0 评论 -
VsCode + gdb + gdbserver远程调试C++程序
在windows中我们可以通过visual studio远程调试windows程序,在linux下我们也可以通过gdb和gdbserver远程调试linux程序。但传统的gdb + gdbserver远程调试有个问题是不够直观,工程师必须学习gdb命令且只能在命令行中调试。所幸的是由于这几年技术的发展,VsCode已经可以支持远程调试的功能了,用户可以在window上的VsCode中边看代码边远程调试linux下的程序(包括服务器程序、嵌入式arm板子上的程序、甚至是linux内核等)原创 2022-02-05 22:45:28 · 17031 阅读 · 0 评论 -
Vscode编译调试C++程序
一、简介本文讲述在windows平台下在Vscode中使用gcc/g++编译C++程序,并使用gdb调试的方法。二、安装插件和其它依赖首先在Vscode中安装如下插件:C/C++C/C++ Extension PackCode Runner在 https://jmeubank.github.io/tdm-gcc/下载一个最新的gcc安装gcc后,在cmd中执行命令:gcc -v。如果看到有如下输出,则表明gcc安装成功了。..原创 2022-02-05 12:40:57 · 13890 阅读 · 0 评论 -
unique_ptr内存泄露
STL中我们可以使用智能指针来减少内存泄露,比如unique_ptr。当unique_ptr离开作用域,指针所包含的内容会被释放。但需要注意的是,其使用不当也一样会造成内存泄露。情况一:没有正确使用release函数#include <iostream>#include <memory>#include <vld.h>using namespace std;int main(){ unique_ptr<int> ptr(n原创 2022-01-15 20:33:07 · 1884 阅读 · 1 评论