C/C++
文章平均质量分 74
阿飞__
熟悉 Android、C++ 等
展开
-
C++ 新旧版本两种读写锁
读写锁(Read-Write Lock)是一种并发控制机制,用于多线程环境中实现对共享资源的高效读写操作。读写锁允许多个线程同时读取共享资源,但在有写操作时,需要互斥地独占对共享资源的访问,以确保数据的一致性。C++17前可以通过mutex和实现一个自定义的读写锁。});writing;});private:#include "ReadWriteLock.hpp" // 包含上面ReadWriteLock的头文件// 共享数据。原创 2023-09-04 21:32:47 · 864 阅读 · 0 评论 -
C++ 自定义项目日志库,支持log分级、标签、耗时统计、显示文件名方法名行号信息等,Windows&Linux通用
一、效果展示功能点:log输出时间,精确到毫秒log等级,支持 V,D,I,W,Elog标签,可以根据标签筛选不同的loglog信息,自动添加文件名、方法名、行号输出,帮忙快速定位到log在工程中的位置耗时统计功能附上测试代码:在linux下编译的话需要链接pthread,即编译命令加上 -lpthread。#include "LogUtils.h"#include <thread>void foo() { for (int i = 0; i < 5;原创 2021-12-01 16:33:53 · 4321 阅读 · 0 评论 -
NDK/C++ 耗时统计类TimeUtils
一、需求分析在开发阶段中,经常会需要打印出某些方式或步骤的耗时情况,大致需求如下:能打印出某个步骤的耗时;有开关可以控制打开和关闭耗时统计;使用方便。二、准备工作之前介绍过一个 log 输出的工具类,可以沿用,链接为:https://blog.csdn.net/afei__/article/details/81030373。LogUtils.h 示例:#ifndef _LOG_...原创 2019-08-21 17:37:42 · 3583 阅读 · 1 评论 -
C++ Lambda表达式详解
一、简介C++11开始引入了Lambda表达式,可将lambda表达式视为包含公有operator()的匿名接口(或类),这样可以更方便的使用函数对象或创建匿名函数(类似Java的匿名内部类)。二、Lambda表达式定义lambda表达式的定义必须以方括号([])打头。这些方括号告诉编译器,接下来是一个lambda表达式。方括号后面是一个参数列表,该参数列表与不使用lambda表达式时提供给operator()的参数列表相同。[capture list] (params list) mutable原创 2021-04-26 16:34:03 · 2654 阅读 · 4 评论 -
堆排序法(Java & C/C++ 实现)
一、前言堆排序是利用堆这种数据结构而设计的一种排序算法。时间复杂度为 O(n * lg n)。介绍堆排序前,我们先介绍一下堆的相关概念,如果你对堆的概念还不熟悉的话可以看看。 二、堆1. 示意图2. 性质除最底层外,该树是完全充满的,且是从左到右填充。树的根结点是 A[ 1 ],若某一结点下标为 i,则很容易得到它的父节点为 i/2,左子结点为 2i,右子结点为...原创 2018-10-07 15:27:39 · 380 阅读 · 0 评论 -
Effective C++ 改善程序与设计的55个做法,总结笔记(上)
前言最近在看《Effective C++》这本书,这博客相当于是个浓缩版的总结吧。在这里你可以大致游览下在 C++ 开发中前人给了我们哪些建议,有机会我觉得最好还是可以看看原书,因为里面会有不少具体的例子告诉你为什么这么做以及这么做的好处。一、让自己习惯 C++1. 视 C++ 为一个语言联邦我们可以视 C++ 为一个由相关语言组成的联邦而非单一语言,例如:C:包括区块 blocks...原创 2018-10-28 20:50:43 · 1922 阅读 · 0 评论 -
Effective C++ 改善程序与设计的55个做法,总结笔记(下)
前言Effective C++ 改善程序与设计的55个做法,总结笔记(上):https://blog.csdn.net/afei__/article/details/83478161六、继承和面向对象设计32. 确定你的 public 继承塑模出 is-a 关系继承是 is-a 关系,指 “是一个”,即父类的每条属性和方法都应该适用于子类。33. 避免遮掩继承而来的名称对于变量和函...原创 2018-11-01 18:08:13 · 1817 阅读 · 0 评论 -
More Effective C++ 35个做法
前言最近在看《More Effective C++》这个书,自己 C++ 基础还是不行,有的地方看的有点懵,最后还是坚持看完了,做做笔记,简短的 记录一下有哪些改善编程与设计的有效方法。推荐还是可以买一本原书的,书中例子比较丰富,更容易理解一些。一、基础议题1. 仔细区别指针(pointer)和引用(reference)指针可以指向 null,引用不允许指向 null。指针可以重新被赋...原创 2018-11-13 11:32:29 · 2417 阅读 · 0 评论 -
Linux 进程通信之:命名管道 (FIFO)
一、简介由于管道(Pipe)只能应用于存在血缘关系的进程间通信,为了突破这个限制,使用命名管道(FIFO)来实现 不相干进程间 的通信。FIFO 是 Linux 基础文件类型中的一种,它并不占用磁盘上实际的数据块,而仅仅是标识内核中的一条通道。各进程可以打开这个文件进行 read/write,实际上是在读写内核通道。二、API 说明1. 头文件#include &lt;sys/types...原创 2018-11-16 08:35:24 · 1001 阅读 · 0 评论 -
Linux 进程通信之:管道 (Pipe)
一、简介管道(pipe) 是一种最基本的 IPC(Inter Process Communication) 机制,优点是简单。二、特点:管道只适用于 存在血缘关系 的两个进程之间通信,因为只有存在血缘关系的两个进程之间才能共享文件描述符管道分为两端,一端读,一端写,有两个文件描述符分别表示读端和写端管道是单向的,数据从写端输入,从读端取出管道的本质是一个伪文件(实为内核缓冲区)管道...原创 2018-11-15 16:27:11 · 1103 阅读 · 0 评论 -
Linux 进程通信之:内存映射(Memory Map)
一、简介正如其名(Memory Map),mmap 可以将某个设备或者文件映射到应用进程的内存空间中。通过直接的内存操作即可完成对设备或文件的读写。.通过映射同一块物理内存,来实现共享内存,完成进程间的通信。由于减少了数据复制的次数,一定程度上提高了进程间通信的效率。二、API 说明1. 头文件#include <sys/mman.h>2. 创建内存映射void *mm...原创 2018-11-19 17:51:49 · 10944 阅读 · 0 评论 -
Linux 进程通信之:内存共享(Shared Memory)
一、简介共享内存允许两个进程访问同一块内存区域,它们使用同一个 key 值标记。二、特点优点:通信方便,两个进程也是直接访问同一块内存区域,减少了数据复制的操作,速度上也有明显优势。缺点:没有提供同步机制,往往需要我们使用其它(例如信号)等手段实现进程的同步工作。三、API 说明1. 头文件#include &lt;sys/shm.h&gt;2. 创建内存共享区int sh...原创 2018-11-17 14:59:11 · 8351 阅读 · 2 评论 -
智能指针之 shared_ptr 的使用
一、智能指针1. 什么是智能指针简单地说,C++智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能够及时、妥善地销毁动态分配的数据,并实现了明确的对象生命周期,因此更有价值。2. 常规指针存在的问题C++在内存分配、释放和管理方面向程序猿提供了全面的灵活性。但是这种灵活性是把双刃剑,一方面它使C++成为一种功能强大的语言,另一方面它让程序猿能够制造与内存相关的问题,比如内存泄漏。...原创 2018-12-17 17:50:17 · 3069 阅读 · 1 评论 -
C/C++ 获取结构体中变量的偏移量
某些特殊需求下,我们需要知道某个变量在其结构体中的偏移位置。通常的做法就是定义一个宏变量,如下:#define OFFSET(structure, member) ((int64_t)&((structure*)0)->member) // 64位系统#define OFFSET(structure, member) ((int32_t)&((structure*...原创 2018-09-28 09:29:30 · 7317 阅读 · 0 评论 -
C/C++ log工具类LogUtils
一、前言开发中打印一些程序 log 是一个很很很常用的需求了,怎么样打印这些 log 其实也很重要,除了必须的一些信息外,通常打印出这条 log 信息所在的 文件名、方法、行号 这类通用信息,也可以更好的帮助我们定位问题。并且,C 语言的 printf 为例,它并不是自己换行,每行 log 还需要我们手动添加一个 \n ,这个也是比较麻烦的,还容易漏掉。所以,我们可以定制一个这样的 log...原创 2018-09-13 09:56:59 · 4902 阅读 · 1 评论 -
使用 typedef 定义函数指针,更优雅的使用函数指针
简介关于函数指针的介绍,这里就不做过多说明了,不了解的同学可以看看这篇博客:https://blog.csdn.net/afei__/article/details/80549202 使用 typedef 定义函数指针通过下面这个例子,我们看看 typedef 是怎么搭配函数指针使用的吧。int add(int a, int b) { return a + b;...原创 2018-08-24 09:23:56 · 26189 阅读 · 4 评论 -
C/C++ 函数指针
一、定义 函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。扩展:函数指针和指针函数的区别? 他们只是名字比较像。函数指针是指向函数的指针变量,本质是一个指针。而指针函数是返回值为指针的一个函数,本质是一个函数。二、声明方法 返回值类型 ( * 指针变量名) ([形参列表]); 例如:int func(int x); /* 声明...原创 2018-06-02 17:01:19 · 6916 阅读 · 8 评论 -
智能指针 unique_ptr 详解
一、智能指针1.什么是智能指针简单地说,C++智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能够及时、妥善地销毁动态分配的数据,并实现了明确的对象生命周期,因此更有价值。2.常规指针存在的问题C++在内存分配、释放和管理方面向程序猿提供了全面的灵活性。但是这种灵活性是把双刃剑,一方面它使C++成为一种功能强大的语言,另一方面它让程序猿能够制造与内存相关的问题,比如内存泄...原创 2018-06-12 20:28:54 · 19200 阅读 · 0 评论 -
如何在Android系统上运行C++程序
一、前言有两种方式:使用 NDK,通过 JNI 的方式来调用 C++ 的方法。这部分知识点很多,可以参考:Android NDK 从入门到精通(汇总篇) Android 的本质是基于 Linux 系统的,我们是可以直接运行 C++ 的程序关于第二点,是需要我们有 root 权限的。但是它也是很方便的,例如有一个 C++ 的 SDK,需要运行在 Android 系统上测试,直接编写一个可...原创 2018-06-17 17:42:53 · 33515 阅读 · 8 评论 -
求 yuv( nv12 / nv21 ) 图片各通道的均值
一、简介 YUV,是一种颜色编码方法。常使用在各个视频处理组件中。“Y”表示明亮度(Luminance、Luma),“U” 和 “V” 则是色度、浓度(Chrominance、Chroma)。 NV21 和 NV12 是 YUV 的两种具体编码形式,以一个 2*2 像素大小的图为例,则排列如下: NV21:YYYYVUVU NV12:YYYYUVUV 二...原创 2018-07-23 16:25:16 · 2097 阅读 · 0 评论 -
求图片的平均亮度
图像相关开发中,有时我们需要知道和了解图片的 亮度 这一信息,例如判断图片是否曝光严重过度或者太黑什么都看不清。那么怎么去获取到图片的 平均亮度 这一信息呢?一、YUV 图片 一般相机的原始数据类型就是 YUV 格式,这种格式下很容易求得亮度,因为它的 Y 通道就是亮度通道,我们只需要求得 Y 通道的平均值就可以了。 由于 YUV 图片前 width * he...原创 2018-07-24 15:09:51 · 11433 阅读 · 0 评论 -
C/C++ 命令解析:getopt 方法详解和使用示例
一、简介getopt() 方法是用来分析命令行参数的,该方法由 Unix 标准库提供,包含在 <unistd.h> 头文件中。 二、定义int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg;extern int optind, opterr, o...原创 2018-07-28 15:58:42 · 49984 阅读 · 9 评论 -
NDK 开发之“文件夹遍历”(C++文件夹遍历)
Java 层只给 JNI 层传递文件夹路径,在 JNI 中完成文件夹里的文件操作,通常都避免不了需要使用到 文件夹遍历 这个功能。那么,在 NDK 开发中怎么进行文件夹的遍历呢?其实这就和 C++ 的文件夹遍历方式差不多。NDK 也给我们提供了 <dirent.h> 头文件,通过这个头文件中的相关方法,我们就可以完成这个功能了。native-lib.cpp代码如下:#in...原创 2018-08-01 17:13:24 · 5081 阅读 · 0 评论 -
C语言,文件操作详解
在 C 语言中,文件操作的函数大多包含在 头文件中,使用时记得 #include。一、打开和关闭文件1. 打开文件FILE * fopen ( const char * filename, const char * mode );打开一个文件,成功则返回文件的指针,失败则返回 NULL。任何打开的文件在不需要使用后都必须关闭。模式:r 打开只读文件,文件必须存在...原创 2018-08-19 10:35:08 · 9958 阅读 · 5 评论 -
C++ 运算符重载详解
一、什么是运算符重载运算符重载实质还是一个 函数。通过重载运算符,可以让类在一些场景下使用起来更加方便。二、语法返回值类型 operator op (参数);示例:ClassType& operator= (const ClassType& src); // 重载 “=” 运算符三、实现方式1. 类成员函数即在类中定义...原创 2018-08-26 18:10:54 · 16315 阅读 · 0 评论 -
C++ 类成员函数的函数指针
一、引言当我们在 C++ 中直接像 C 那样使用类的成员函数指针时,通常会报错,提示你不能使用非静态的函数指针:reference to non-static member function must be called两个解决方法:把非静态的成员方法改成静态的成员方法 正确的使用类成员函数指针(在下面介绍) 关于函数指针的定义和使用你还不清楚的话,可以先看这篇博客了解一下...原创 2018-08-23 18:40:17 · 55154 阅读 · 10 评论 -
C++ 二义性是什么?怎么解决?
一、什么是二义性在多继承的场景里,当父类中存在同名变量时,子类访问父类的同名变量,将出现二义性,因为编译器不知道你将要访问的是哪个父类中的变量。举个例子:class A{public: int a; // B1,B2 都将继承一个变量 a};class B1 : public A{};class B2 : public A{};class C : publ...原创 2018-08-28 09:33:15 · 31383 阅读 · 0 评论 -
C++ 多态的实现原理分析
一、什么是多态在面向对象开发中,多态是一个很重要的特性。什么是多态呢?就是程序运行时,父类指针可以根据具体指向的子类对象,来执行不同的函数,表现为多态。 二、C++ 多态的实现原理1. 实现原理当类中存在虚函数时,编译器会在类中自动生成一个虚函数表 虚函数表是一个存储类成员函数指针的数据结构 虚函数表由编译器自动生成和维护 virtual 修饰的成员函数会被编译器放入...原创 2018-08-28 11:31:15 · 9601 阅读 · 0 评论 -
C++四种类型转换运算符详解
一、C风格类型转换char* staticStr = "Hello World";int* intArray = (int*)staticStr; 这种类型转换是不安全的,C++编程应该尽量使用C++的类型转换运算符 二、C++类型转换运算符1. static_cast static_cast 用于在相关类型的指针之间进行转换,还可以显示的执行标准数...原创 2018-05-13 18:25:25 · 2125 阅读 · 0 评论