
C/C++
文章平均质量分 75
C/C++常见问题记录和分享。
工头阿乐
实践是检验真理的唯一标准。
展开
-
spdlog C++日志库使用教程
Spdlog是一个快速、异步、线程安全的C++日志库,他可以方便地记录应用程序的运行状态,并提供多种输出格式。安装教程可以参考:https://blog.youkuaiyun.com/Harrytsz/article/details/144887297Spdlog的优点:只包含头文件速度很快无需依赖第三方库支持跨平台支持多线程—线程安全可对日志文件进行循环输出可每日生成日志文件可支持控制台日志输出可选的异步输出可定义日志格式1、日志级别。原创 2025-04-08 15:17:03 · 1069 阅读 · 0 评论 -
C/C++高效编译工具ccache
在处理一些规模相对较大的工程时,编译花费的时间可能会很长。有时候我们会经常一遍一遍地编译相同的程序,此时,有了ccache情况就好多了。它将在第一遍编译时多花几秒钟,但接下来就会使编译成倍(5-10倍)的提速。ccache 的基本原理是通过将头文件高速缓存到源文件之中而改进了构建性能,因而通过减少每一步编译时添加头文件所需要的时间而提高了构建速度。以下来了解下如何同时使用 ccache 和distcc 来使开发环境达到最佳性能。原创 2025-03-18 14:33:36 · 886 阅读 · 0 评论 -
bazel使用教程详解
bazel的所有代码都在当前工程,每个工程都是一个 WORKSPACE。每个WORKSPACE下有多个package(包含BUILD文件的文件夹被称为package),BUILD内是多个targets,同一个package内的targets默认互相可见,不同package之间targets的可见性需要手动定义,可以在每个package的BUILD文件顶部声明其中的targets对其他包的默认可见性。原创 2025-01-20 16:54:25 · 654 阅读 · 0 评论 -
C++常用的三个网络编程库介绍
在C++的世界里,网络编程是许多应用程序的基础,尤其是在服务器端开发中。不同的框架提供了不同的特性和便利性,今天我们就来对比一下三个流行的C++网络编程框架:Boost.Asio、Poco和MUDuo(也称为muduo),看看它们各自的优势和适用场景,并通过实际案例加深理解。原创 2024-12-24 09:47:25 · 1082 阅读 · 0 评论 -
C/C++常用的一些性能分析测试工具汇总
常用的性能测试工具汇总原创 2024-11-22 10:52:21 · 185 阅读 · 0 评论 -
C++多线程编程的高效利器-无锁队列
在 C++ 的多线程编程世界中,有一个神奇的存在 —— 无锁队列。它宛如一座坚固的桥梁,横跨在多线程协作的鸿沟之上,成为提升程序性能和稳定性的关键角色。随着计算机硬件的不断发展,多核处理器已经成为主流。多线程编程由此变得愈发重要,然而,传统基于锁的同步机制却逐渐暴露出诸多问题。在这一背景下,无锁队列应运而生,它宛如黑暗中的灯塔,为多线程程序的高效运行照亮了前行的道路。想象一下,在一个繁忙的交通枢纽,传统的锁机制就像是交通管制中的红绿灯,虽然能维持秩序,但频繁的等待和切换也会造成拥堵。原创 2024-11-12 10:54:57 · 2006 阅读 · 0 评论 -
盘点17个C++17的高级特性
C++17是目前比较常用的版本之一,今天花时间来梳理一下17个重要特性,所有的特性也不止这么点。原创 2024-06-12 16:30:39 · 1066 阅读 · 0 评论 -
boost.circular_buffer的使用和介绍
如果达到容量上限,继续push_back方法压入元素时,原来begin处的元素就会被覆盖,原来begin + 1处的元素成为新的begin,push_front功能类似。这几种方式都有各自的缺点:用list构造无法实现随机访问,用vector构造移动数据头开销较大,用数组构造需要维护数据头指针和防止计数器溢出,计算位置和数据的移除也相对较麻烦。也就是说,circular_buffer的内部还是通过数组来实现,只不过给我们做好了封装工作,提供了vector类似的接口,用起来非常简便。原创 2024-01-17 10:27:43 · 1203 阅读 · 0 评论 -
Ubuntu开启生成Core Dump的方法
Ubuntu下无法生成Core Dump解决方法。原创 2023-08-30 10:36:45 · 2111 阅读 · 0 评论 -
pthread_sigmask使用详解
对于线程信号,你应该忘记signal / sigaction ,他们只为单进程单线程设计pthread_sigmask 跟 sigprocmask 类似;sigprocmask 只能用于单进程单线程;fork的子进程拥有一份屏蔽信号拷贝;pthread_sigmask 用于多线程;新线程拥有一份pthread_create那个线程的屏蔽信号拷贝;对于线程信号的处理 , 最好还是用一个线程来统一处理比较, 否则太乱啦!关于线程安全和可重入, 完全2个概念:线程安全 可重入。原创 2023-08-01 17:15:37 · 1902 阅读 · 0 评论 -
线程安全和函数可重入
这意味着, 在main中gethostbyname的调用刚执行完或者只执行了一半, 此时signal来了, 转到sig_handler继续调用gethostbyname ,由于实现是一个静态变量,因此后调用gethostbyname将把前一次的数据覆盖.可重入函数只有在signal下会发生, 比如一个函数在执行时被中断, 在中断处理函数中又一次被调用, 这2次(每次)调用都能产生正确的结果,那就个可重入函数;一个函数中如果使用了静态/全局变量, 那他基本是一个不可重入的函数,当然具体还是看实现;原创 2023-08-01 14:00:10 · 203 阅读 · 0 评论 -
bazel构建C++ 动态链接库so文件
bazel是Google开源的一款编译工具,具有支持多种语言,编译速度快,处理依赖方便,编写编译规则简单的优点。有人说,bazel是流氓工具,为什么呢?因为它不仅QJ你们组,还QJ你的兄弟组。意思是说一个组用了bazel,其他组为了协同工作,也必须用bazel,否则作为一个项目整体没法管理。这在一定程度上是对的,因为一个项目想打包成一个整体,如果其中一部分使用bazel编译,另外一部分写makefile编译,那么这两个部分没法生成一个完整的动态链接库给外界使用。原创 2023-06-26 11:19:40 · 1575 阅读 · 0 评论 -
C++11 make_shared函数和std::make_unique详解
如果使用std::unique_ptr和std::make_unique来替换std::shared_ptr和std::make_shared,事实上,会用到同样的理由。这样通过std::shared_ptr的make函数分配的函数则在最后一个std::shared_ptr和最后一个std::weak_ptr被销毁前不能被释放。假如我们把std::shared_ptr和std::make_shared替换成std::unique_ptr 和std::make_unique,会发生相同的事情。原创 2023-04-18 18:10:49 · 6586 阅读 · 0 评论