
C++ 没有结局的开始
文章平均质量分 68
C++编程语言学习
龚建波
熟悉C++ Qt,Python等
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
cpp-httplib库的基本使用及文件上传下载
cpp-httplib 是一个header-only 的跨平台 HTTP/HTTPS 网络库,采用 MIT 开源协议,接口为阻塞调用。虽然功能简单,但也不用一堆依赖,C++ 的接口也比 libcurl 的 C 接口用起来顺手一点,文档也提供了不少参考代码,如果是做简单的 HTTP server 或者 client 还是值得一试的。原创 2023-09-20 14:49:47 · 12454 阅读 · 0 评论 -
面试官的动机:memcpy 与 memmove
面试中经常考察 memcpy 和 memmove 的实现,百度一搜,有很多篇文章,但遗憾的是,很多都是有问题的,并且互相抄来抄去,一起出错。面试官通过考察memcpy的实现,可以考察应聘者对以下知识点的掌握:内存对齐的理解 内存存取粒度与效率的关系 内存重叠的问题(memory overlap)基本实现#include <stdio.h>void *memcpy(void *dst, void const *src, size_t size){ assert((d转载 2022-03-14 19:13:13 · 819 阅读 · 0 评论 -
面试题之 strcpy/strlen/strcat/strcmp 的实现
一、字符串拷贝strcpy函数strcpy的原型是char* strcpy(char* des , const char* src),des 和 src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串。#include <assert.h>#include <stdio.h>char* strcpy(char* des, const char* src){ assert((des!=NULL) && (src!=N...转载 2022-03-14 19:06:41 · 541 阅读 · 0 评论 -
复习C++标准库多线程的基本使用
参考书籍:《C++并发编程实战》参考文档:https://en.cppreference.com/w/第一章:你好,C++并发世界(略)第二章:管理线程(2021-05-07 笔记)类 std::thread 表示单个执行线程,thread 对象允许 move 但不能 copy 。 构造函数:template< class Function, class... Args >explicit thread( Function&& f, Args&am原创 2021-05-08 00:21:11 · 740 阅读 · 0 评论 -
giflib基本使用
0.前言GIF 是 Graphics Interchange Format (图形交换格式)的缩写,采用 Lempel-Zev-Welch(LZW)压缩算法,最高支持256种颜色。GIF 原本是有专利限制的,不过早就过期了,估计这也是 Qt 等开源库/框架只有对 GIF 解码没有编码操作的原因吧,但 ImageMagick和 FFmpeg 等是支持 GIF 编解码操作的。GIF 有 GIF87a 和 GIF89a 两个版本。GIF87a 版本是 1987 年推出的,一个文件存储一个图像,严格不.原创 2021-04-05 23:47:24 · 6233 阅读 · 5 评论 -
记录:Windows上MSVC2017编译gRPC 1.36
下载并安装 git:https://git-scm.com/downloads下载并安装 CMake:https://cmake.org/download/下载并安装 perl:https://www.perl.org/get.html下载并安装 golang:https://studygolang.com/dl下载并安装 OpenSSL:https://openssl.en.softonic.com/原创 2021-03-09 11:32:48 · 1019 阅读 · 0 评论 -
spdlog 日志库学习,简易封装
spdlog wiki:https://github.com/gabime/spdlog/wiki别人的学习笔记:https://www.cnblogs.com/oucsheep/p/8426548.html别人的学习笔记:https://github.com/gabime/spdlog/wiki百度搜 spdlog 封装可以看到很多写的差不多的单例类,我看公司遗留的代码也是借鉴这些写的。最常见的是一开头就写上:#ifdef _WIN32#define __FILENAME__ (s原创 2021-01-27 22:55:30 · 3809 阅读 · 0 评论 -
spdlog 日志库学习,自定义 sink
spdlog wiki:https://github.com/gabime/spdlog/wiki别人的学习笔记:https://github.com/gabime/spdlog/wikispdlog 有daily_file_sink 每日创建一个 和rotating_file_sink 根据大小翻滚,但是每个 sink 是独立处理的,没法根据时间和文件大小来同时作为生成条件,只好继承 base_sink 自定义。首先是文件名的拼接,参照daily_file_sink 源码: ...原创 2021-01-19 00:13:38 · 4967 阅读 · 3 评论 -
使用 FFmpeg 获取音频文件编码格式、采样率等信息
(2022-08-25 修改)之前用av_get_bytes_per_sample(guard.codecCtx->sample_fmt)获取采样精度,因为参数枚举AVSampleFormat并不对应文件实际的采样精度,所以读取出来的信息如24bit时会识别成32bit,现在用av_get_bits_per_sample(guard.codecParam->codec_id)来获取。我是在 Qt 里跑的,所以路径用了 QString 传递,然后 FFmpeg 使用的 4.2 版本进行测试。...原创 2020-11-20 01:31:31 · 8782 阅读 · 0 评论 -
测试 std::mutex && CRITICAL_SECTION && QMutex 三者的效率
std::mutex 标准库的互斥锁;CRITICAL_SECTION Windows提供的临界区;QMutex Qt提供的互斥锁封装,显然,Qt封装的效率一般不如前两者。参照这篇文章:https://www.iteye.com/blog/aigo-1908084和他的结论差不多:在旧版本编译器上(如VS2013),std::mutex 比临界区更慢;在新版本编译器上(如VS2015/2017),std::mutex 的效率显著提高,特别在竞争情况下比临界区快多了。下面是 VS2013 和 VS原创 2020-09-01 15:23:52 · 2301 阅读 · 3 评论 -
C++ XML 库 TinyXML2 的基本使用
0.前言TinyXML-2 是一个简单,小型,高效的 C ++ XML 解析器,可以轻松集成到其他程序中,直接引用源文件的话只需要包含两个文件(h 和 cpp,此外还有个测试文件里面带有 demo)。TinyXML-2 解析 XML 文档,并以此为基础构建可读取,修改和保存的文档对象模型(DOM)。文档说,在解释 XML 时仅使用 UTF-8 ,假定所有 XML 为 UTF-8 (看了下使用 MSVC 编译器时生成的 XML 文件文本编码使用的本地编码)。该库还支持打印到文件或内存,使用 XMLPr原创 2020-08-12 00:36:55 · 17762 阅读 · 5 评论 -
C++ std::function函数包装器
0.前言类模板 std::function 是通用多态函数封装器。 std::function 的实例能存储、复制及调用任何可调用对象。C++语言中有多种可调用对象:函数、函数指针、lambda表达式、bind创建的对象以及重载了函数调用运算符的类(仿函数)等。和其他对象一样,可调用对象也有类型。如:每个lambda有它自己唯一的(未命名)类类型;函数及函数指针的类型则由其返回值类型和实参...原创 2020-03-28 15:19:08 · 1377 阅读 · 0 评论 -
C++ std::bind函数适配器
0.初识C++11 提供了一个名为std::bind的函数模板,可用于生成可调用对象的转发调用包装器,相当于是个通用函数适配器(旧版本的bind1st/bind2nd已被弃用),可以适配任意的可调用对象,包括函数指针、函数引用、成员函数指针和函数对象。它接受一个可调用对象,生成一个新的可调用对象来适配原来的参数列表。bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::f...原创 2020-03-27 13:28:05 · 772 阅读 · 0 评论 -
C++ Lambda表达式的基本使用
0.前言Lambda表达式(也叫lambda函数,或简称lambda),是从C++ 11开始引入并不断完善的,是能够捕获作用域中变量的匿名函数对象。因为C++是不能嵌套定义函数的,所以lambda就成了我们构造闭包的主要手段,不过在对象的生命周期上还是有点不同。本文主要展示lambda的基本使用(一些我不常用或者新标准如C++20就先不做笔记了,以在线文档为准)。目录1.认识Lamb...原创 2020-03-27 00:42:03 · 25274 阅读 · 5 评论 -
C++学习笔记:友元
0.前言什么是友元?友元是允许另一个类或者函数访问某个类非public成员的机制,方法是使用friend说明符在类定义中进行额外的声明。既然友元可以访问类的非公有成员,那么可以认为在一定程度上破坏了类的封装性。但我们也可以把他们看成一个整体,那么友元也就是封装的一部分。并且,友元使得编码更加自由,提高了灵活性。和普通的类成员不同,友元关系既不继承,也不传递。友元不一定是派生类的友元,这...原创 2020-03-25 14:41:59 · 547 阅读 · 0 评论 -
C++学习笔记:强制类型转换
0.旧式转换先看看旧式的强制类型转换(如,整数进行浮点除法时会把其中一个变量用旧式转换转为 double): //type(expr) 函数形式的强制类型转换 int count1 = 10; bool not_empty1 = bool(count1); //为true //或者(type)expr C语言风格的强制类型转换 int count2 = 0; bool no...原创 2020-03-19 23:41:10 · 1085 阅读 · 0 评论 -
C/C++ 中那些可变长参数
C/C++提供了一些处理可变长参数/扩展参数包的宏、函数、模板,本文主要是记录下他们的使用方式1. 使用<stdarg.h>中的宏stdarg.h 头文件定义了一个变量类型 va_list 和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数。可变参数的函数通在参数列表的末尾是使用省略号(,...)定义的。很多C语言库都是使用这种方式来处理输入参数列表的。...原创 2019-10-31 11:25:34 · 6047 阅读 · 1 评论 -
C++ std::condition_variable条件变量
C++11提供了两个条件变量的实现:std::condition_variable和std::condition_variable_any。std::condition_variable只可与std::mutex一起使用;std::condition_variable_any更加灵活,但需要额外的性能代价。先看看std::condition_variable的接口:被等待的线程(唤醒别...原创 2019-08-31 21:54:39 · 1477 阅读 · 0 评论 -
C++ std::future期值
(本文参照C++在线手册和《C++并发编程实战》)0.了解std::futureC++11提供了类模板std::future来访问异步操作结果。可以使用future来代表特定的一次性事件,线程周期性的在这个future上检测事件是否发生,当所需的事件已发生future变为就绪状态,事件发生之后future也无法复位。标准库中有两类future,唯一future(std::future)对象是仅有的一个指向其关联事件的实例,而多个共享future(std::shared_future)对象可以指向同一原创 2019-09-13 21:39:17 · 2945 阅读 · 0 评论 -
C++ std::atomic_flag与sta::atomic<bool>布尔标志
1.std::atomic_flagstd::atomic_flag是最简单的标准原子类型,他代表一个布尔标识,没有拷贝构造函数和拷贝赋值运算符(=delete)。std::atomic_flag对象可以是两种状态之一:设置或清除,且必须用ATOMIC_FLAG_INIT初始化,这会将该标志初始化为清除状态(此标志总是以清除状态初始化的),如下:std::atomic_flag fl...原创 2019-10-09 13:45:42 · 22886 阅读 · 0 评论 -
C++基础学习笔记:指针
C++指针学习过程中的一些代码笔记,比较马虎,有些错漏原创 2017-09-09 12:07:40 · 3392 阅读 · 0 评论 -
C++基础学习笔记:函数
C++函数的学习笔记,代码原创 2017-09-09 22:49:57 · 3330 阅读 · 0 评论 -
C++基础学习笔记:运算符重载
学习C++类的运算符重载和类转换的代码与注释。原创 2017-09-11 08:55:40 · 3242 阅读 · 0 评论 -
C++基础学习笔记:类与动态内存分配
C++类和动态内存分配的简单代码和注释原创 2017-09-11 11:13:28 · 3291 阅读 · 0 评论 -
C++通过OCILIB连接Oracle
先附上参考 http://blog.youkuaiyun.com/rznice/article/details/74466123准备:1.ocilib,直接百度然后有个GitHub的链接,我这边下的是ocilib-4.4.0-windows.zip 2.VS2012/15/17均可3.Oracle11g一开始我是按照参考博客里面的方法完成的,不过后来经过小伙伴的验证,完全不需要那么麻烦的配...原创 2017-11-06 19:40:50 · 5087 阅读 · 0 评论 -
C++二叉树的遍历:深度优先(前序、中序、后序)和广度优先(层次)
准备深度优先遍历:沿着每一个分支路径进行深入访问。前序、中序、后序都是深度优先遍历的特例。可以用递归实现,非递归一般借助栈容器。广度优先遍历:又叫层次遍历,对每一层依次访问。可以借助队列容器来实现。先定义和创建一颗二叉树#include <iostream>#include <vector>#include <queue>#in...原创 2019-03-10 15:56:42 · 6189 阅读 · 0 评论 -
单链表反序
看图说话,需要用到三个连续节点的指针,用中间那个来进行反序操作(P2->next=P1)。template<typename T>struct Node{ T value; Node<T> *next;};template<typename T>Node<T> *singleLinkedListReverse(Node...原创 2019-03-10 20:55:22 · 2069 阅读 · 0 评论 -
C++ std::thread初步了解
0.前言C++标准库从C++11开始提供了线程的支持,本文为《C++并发编程实战》第二章的学习笔记。1.启动线程先从一个简单的例子开始:#include <iostream>#include <thread>void test(){ std::cout << "hello world!" << std::endl;}...原创 2019-08-11 18:32:44 · 9737 阅读 · 0 评论 -
C++ std::mutex互斥元/锁
0.前言将多线程作为并行的关键优点之一,在于它们之间简单直接地共享数据的能力。但当多个线程修改同一数据时,就很容易因为竞争而导致错误的执行结果。若所有线程只是进行读取操作,就没有问题。1.认识std::mutex由C++标准提供的保护共享数据的最基本机制是互斥元/锁(mutex)(读缪特克斯)。在访问共享数据之前,锁定(lock)与该数据相关的互斥元,访问完成后,解锁(unlock)该...原创 2019-08-25 00:09:55 · 3395 阅读 · 0 评论 -
C++ std::shared_mutex读写锁
0.前言读写锁把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。C++17开始,标准库提供了shared_mutex类(在这之前,可以使用boost的shared_mutex类或系统相关api)。和其他便于独占访问的互斥类型不同,shared_mutex 拥有两个访问级别:共享:多个线程能共享同一互斥的所有权(如配合shared_lock)...原创 2019-08-25 12:10:25 · 27624 阅读 · 0 评论 -
C++ std::call_once单次调用
在类似“多线程中使用单例的懒汉式初始化”场景中,为了提高效率,通常不是简单的锁定,这会导致不必要的线程序列化。许多人都试图想出一个更好的实现方法,包括臭名昭著的双重检查锁定(Double-Checked Locking)模式(DCLP)。#include <iostream>#include <thread>#include <mutex>clas...原创 2019-08-25 14:16:34 · 724 阅读 · 1 评论 -
libsndfile库的文件与内存读写操作(C++ Qt)
0.前言本文内容接上一篇安装:https://blog.youkuaiyun.com/gongjianbo1992/article/details/98995983这个库用起来还算简单。由于专利原因该库还不支持MP3格式(文档显示目前仅支持wav、aiff、au),之后我准备换ffmpeg来处理我的数据。由于我的音频知识匮乏,所以本文只贴了一些操作的代码段,作为学习记录。使用方式可以参考clone...原创 2019-08-16 17:13:36 · 3899 阅读 · 4 评论 -
Windows上利用vcpkg安装libsndfile音频库
1.安装vcpkg首先是编译器。我的编译器是VS2015/2017,如果使用2017的话需要先把英文语言包装上(Visual Studio Installer-->修改-->语言包)。另外,在我用vcpkg安装第三方库的时候他还提示需要安装git和cmake(提示里需要的版本比较新,可以直接去下载最新的先安装,免得他自动下载时由于网络问题导致失败)。接下来就是vcpkg的安装,...原创 2019-08-09 23:05:26 · 5311 阅读 · 5 评论 -
记录:MSVC编译OpenSSL1.0.x和OpenSSL1.1.x
为了能在qt中访问https,msvc编译器版本的需要自己编译openssl。幸运的是网上有很多相关的博客,所以直接照着做就是了。0.准备工作先从网上下载OpenSSL源文件,我是在这里下载的http://distfiles.macports.org/。安装Perlhttp://www.perl.org/get.html(我用的64bit的,感觉没影响)。1.MSVC201...原创 2019-08-28 16:30:05 · 2340 阅读 · 5 评论 -
C++ 多线程中有时间限制的等待
C++多线程中的一些等待函数允许设定超时。有两类可指定的超时,一是基于时间段的超时等待,一般为 _for 后缀的方法;或者绝对超时,等到一个时间点,一般为 _until 后缀的方法。例如, std::condition_variable 就具有 wait_for() 和 wait_until() 成员函数。1.时钟就C++标准库所关注的而言,时钟是时间信息的来源。具体来说,时钟提供四个不同...原创 2019-09-26 10:17:17 · 7698 阅读 · 0 评论 -
C++基础学习笔记:自定义数组模板类
作业练习:写一个数组类的模板(容器)原创 2017-09-14 13:22:28 · 3520 阅读 · 0 评论