自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(122)
  • 收藏
  • 关注

原创 原子操作与无锁编程

原子操作CAS操作原子操作能替代锁么以上信息需要后续深入理解,目前只是简单了解

2021-02-09 16:32:52 448

原创 【算法】分治、动态规划和贪心算法

这三种算法非常相似,但是又有一些区别,理解如下:分治:把一个问题划分为若干子问题,求出子问题的最优解,再把子问题的最优解进行merge,最终得到原问题的最优解动态规划;原问题的最优解包含子问题的最优解(即,拥有最优子结构),同时,求子问题的最优解过程是存在重复的(即,子问题重叠),而分治法的子问题之间是独立的,不存在重复。这种case需要用动态规划来求解贪心算法:和动态规划类似,但是通过局部最优达到全局最优,而动态规划求解的是全局最优。贪心算法是自顶向下的求解过程。贪心算法只需考虑

2021-02-06 20:45:29 725

原创 多线程 浅谈条件变量

条件变量,cond wait过程中:存在:调用wait前加锁while判断并调用wait,wait内部解锁,wait收到信号后重新加锁\这几步操作,即:在cond wait前,需要加锁,wait时,会把自己放到唤醒队列中,并释放锁;当生产者发来cond signal信号后,该cond wait操作会再次加锁,然后执行对临界资源的操作条件变量有两点需要注意:条件变量要和锁结合起来使用条件变量要用while循环来判断条件是否成立,而不能用if语句来判断关于以上两点的解释,可以参考:多线

2021-02-05 16:25:05 438

原创 记录一次jni内存泄漏

关于jni如何才能不泄露内存的基本原则:c/c++分配的资源,一律需要自己管理(可以用智能指针管理起来,或者用RAII思想管理),否则一定会存在内存泄漏jni api分配的资源,若是c/c++类型,需要自己管理,因为这些变量分配在jni heap上,java不会帮你管理。若是java类型(jstring/jobject等各种j开头的类型),这些变量分配在java heap上,java的GC会帮你回收。我本次的内存泄漏是上述第2点导致,即,我通过GetStringUTFChars从jstring得到

2021-01-26 16:41:16 501

原创 linux socket send函数和recv函数详解以及修改缓冲区大小

一、send/recv详解1.send 函数int send( SOCKET s, const char FAR *buf, int len, int flags );不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0。

2021-01-20 19:48:26 5889

原创 十大经典排序算法

来自十大经典排序算法(动图演示)

2021-01-13 15:40:55 97

原创 android studio生成和使用jar包

生成jar因为项目需求,需要把android代码生成jar包,供别人使用在我调试阶段,我的android代码是app形态的,要想生成jar包,首先就要修改app下build.gradle的第一行(其实就和c++工程中cmake配置add_execute改成add_library类似,我们是为了生成库,不是二进制程序):apply plugin: ‘com.android.application’ 改成 apply plugin: ‘com.android.library’同时,这行代码需要注释掉:

2021-01-11 11:36:52 545

原创 android 9.0申请网络权限

共三部操作:<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.test4">步骤1: <uses-permission android:name="android.permission.INTERNET" /> <appli

2021-01-06 21:12:57 4451

原创 android studio配置jni小结

关于android工程添加jni相关配置,可参考以下博文,简单明了,其实主要就是添加一个CMakeLists.txt,修改下gradle内容(配置cmake路径、配置c++相关的flag):Android笔记之使用CMake进行JNI开发(Android Studio)问题记录:遇到A problem occurred configuring project ‘:app’.(注意,我的android studio在build出错之前,还提示warning: “NDK is missing a “

2021-01-05 21:08:17 192

原创 c++浅探类内存布局

总结多重继承和虚继承不用了解太多,现实中不怎么用到。对单继承若父类和子类都没有虚函数,则子类对象的内存布局没有虚表指针和虚表,只有成员变量的内存(字节需要对齐),且父类成员在内存低地址,子类额外的成员在内存高地址(因此,子类指针可以转换为父类指针,又可以再次转换为子类指针,因为子类对象的内存中低地址为父类的成员变量)若父类有虚函数,则子类对象的内存布局起始地址部分为虚表指针,指向虚表,后面的结构同上。虚表里面,包含了父类和子类的虚函数,若子类覆盖了父类的虚函数,则子类的虚函数在子类的虚表里面。在构

2021-01-05 14:50:08 110

原创 c++优先级队列访问元素方法

stl提供的优先级队列priority_queue,功能很少,主要是没法通过下标或者迭代器访问元素,只能不停地pop元素去逐一访问,非常难用。如何访问优先级队列的元素?方法1,继承c++ stl优先级队列(c++优先级队列内部使用的sequence成员的访问级别是protected,在你的子类中可以把该sequence的迭代器开放出来,达到访问元素目的)方法2,可以利用multimap实现优先级队列,能做到:自定义key比较器相比普通map,multimap允许key重复mult

2020-12-31 15:04:45 1810

原创 android引入framework.jar,调用“废弃”api

主要的一个问题是,在引入framework.jar之后,会出现“Caused by: java.lang.ArrayIndexOutOfBoundsException: 65535”问题解决办法:AS中导入framework.jar包编译,运行全部通过(主要是注释掉了第一句fileTree命令,就解决了65535问题)其他参考:implementation、api、compileOnly区别详解...

2020-12-30 17:54:23 215

原创 c++ std::stringstream清除字符串

stringstream.str()会返回其内部字符串的拷贝。有时候,想清空stringstream内部的字符串内容,真确的清理方式是:stringstream.str(std::string());stringstream.clear();其中,stringstream.str(std::string())的作用是清空stringstream内部的字符串内容,stringstream.clear()的作用是将该流中所有的状态位复位,将流的状态设置为有效。这一句也很关键,这是因为当流发生错误后,

2020-12-14 20:48:15 3841

原创 《计算机网络》传输层 (1)

总结:todo参考:《计算机网络第七版-谢希仁》40 张图带你搞懂 TCP 和 UDP

2020-12-07 21:49:41 139

原创 c++虚函数表知识点

参考:理解 C++ 虚函数表类的普通函数(非虚函数),在内存中地址是唯一的,可以把他们想象成普通函数,只不过第一个参数是this指针,在通过类对象指针调用时,编译器会根据类型找到相应的非虚函数的地址,这个工作是编译期完成的每个类都会维护一个虚表,编译时,编译器根据类的声明创建出虚表,对象被构造时,虚表的地址就会被写入到这个对象内存的起始位置。父类、子类的虚表是不同的,虚表里面的内容也是不一样的(虚表里面记录了要执行的函数的函数指针)。虚函数在执行是一个动态的过程,并不是在编译时就确定下来要执行哪一个函

2020-11-16 14:05:56 195

原创 android ndk程序crash解决手段

背景在linux x86系统中,如果程序发生了crash,可以通过core dump生成core文件,然后gdb进行分析,这方面的资料很多。在android环境中,native程序crash,该怎么办呢?也可以生成core文件,然后用安卓编译工具链里面的gdb等工具进行分析,这块可以参考:Android 下基于core文件分析crash信息更为简单的一种方式,可以直接查看tombstone文件。当native程序崩溃时,安卓会在/data/tombstone目录下生成对应的tombstone文件,该文

2020-10-23 15:01:46 524

转载 【转载】【好文、通俗易懂】Linux 进程、线程、文件描述符的底层原理

看到一篇非常通俗易懂的文章,分享给对这块不熟悉的小白:Linux 进程、线程、文件描述符的底层原理

2020-10-22 20:59:34 232

原创 linux系统获取cpu占用的方法

获取某进程cpu占用有很多方法,比如top命令,ps命令,以及读取系统文件(/proc/pid/stat)等等,有时候需要评估某个程序运行过程中的资源占用(例如cpu占用、mem占用),此时可以利用上面的读取系统文件方法,准确方便地得到cpu/memory占用信息通过/proc/pid/stat文件获取指定进程的cpu占用信息该文件有很多字段,其中跟cpu占用有关的为:utime、stime、cutime、cstime,他们的含义分别为:某进程在用户空间消耗的cpu时间片、在内核空间消耗的cpu时间片、

2020-10-20 17:53:59 1316

转载 shell脚本实现覆盖写文件和追加写文件

1、覆盖写文件 “>”date > not_append_file.txt2、追加写文件">>"echo "hello" > yes_append_file.txtdate >> yes_append_file.txt来自:shell脚本实现覆盖写文件和追加写文件

2020-09-27 19:32:20 7200

原创 视频文件与视频编解码简介

工作中,经常会处理各种后缀名的视频,例如.avi/.mp4等等,怎么理解这些名字呢?其实,对于一个视频,大的概念有两层:第一层就是视频封装格式,即我们熟知的avi、MP4、MOV等都属于视频封装格式。视频封装格式,相当于一种储存视频信息的容器,内部可以存储具体的编码后的视频和编码后的音频文件,以及视频的字幕信息、视频的标题信息,等等编码后的视频和编码后的音频文件,以及视频的字幕信息、视频的标题信息等内容,便是视频文件的第二层,也是比较核心的内容,决定了这个视频的大小以及视频的清晰度。一个完成的视频文件

2020-09-25 15:47:31 1016

原创 md5用途简介

1. 什么是md5?md5计算,是对原始消息做有损的压缩算法,无论消息(输入值)的长度是多少字节,都会生成一个固定长度(128位/16字节)的消息摘要(输出值)md5有以下特性:不可逆(不能从消息摘要恢复出原始输入)恒定性(同样的输入,经过md5算法经过同样的迭代次数,产生的输出一定是相同的)不可预测(输入内容做轻微改变,输出大相径庭)等等2. md5有什么作用数据完整性校验文件完整性校验文件经过网络传输、拷贝或其他操作后,可以通过文件的md5值判断文件内容是否发生了改变。文

2020-09-08 14:43:08 4876

原创 运行shell脚本出现Bad Substitution错误

通过sh xxx.sh运行某个shell脚本,发现出现Bad Substitution错误。最终发现是shell脚本解释器的问题,我采用sh这个命令执行的脚本,对sh这个命令,查看其属性发现:即最终指向的是dash这个解释器。而我们的shell脚本中,有一些数组操作,dash解释器不支持这些操作,而bash解释器支持这些操作,因此,我需要用bash解释器翻译我的shell脚本才行。通过chmod +x xxx.sh ./xxx.sh来执行我的shell脚本(此时使用的是bash解释器),此时发现没有

2020-09-08 11:31:15 11607

原创 git中format-patch和chery-pick的区别和联系

chery-pick:把其他分支的一次或多次commit,在当前分支上重演。典型的使用场景:其他分支有很多提交,但是你只对其中的一部分感兴趣,这时候可以使用chery-pick,只挑选其他分支感兴趣的commit,合并到自己的分支中。format-patch: 类似chery-pick,也是把A分支的一次或多次commit提取出来,应用到B分支上的过程。不过,format-patch可以把感兴趣的commit做成补丁文件(可以远程发送给其他人,这是与cherry-pick最大的不同)。这个补丁文件可以被.

2020-09-03 11:15:35 1266

原创 dns是什么?ubuntu 14.04如何配置并刷新dns?

dns是什么?在Internet上域名与IP地址之间是一对一(或者多对一)的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。DNS是什么?DNS有什么作用?ubuntu14.04如何配置dns?参考:Ubuntu 14.04 DNS 配置最近得到一个比较好用的DNS,每次重启后都修改DNS配置文件 /etc/resolv.conf 重启就会失效从网上得知 /etc/resolv.co

2020-08-07 15:24:24 803

原创 ubuntu 14.04 使用svn的正确姿势

以前只在windows下用过svn,用的是tortoise svn,非常好用。现在工作环境变成了ubuntu,而且版本还是14.04,比较老,该怎么使用svn呢?有几种方法,比如可以通过命令行方式使用(类似git的各种命令),这时候需要安装一个叫做subversion的工具。因为我还是习惯通过gui方式,因此放弃了该方法。还可以安装rabbitvcs svn,貌似也是主流的方法之一。我照着网上的教程弄好之后,重启机器,右键点击文件,可以看到rabbitvcs svn的标识,但是点击标识没反应,时间关系,

2020-08-05 11:00:58 293

原创 android设备uuid、udid

前言udid:UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识.uuid:UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码.简言之:udid对应某个硬件设备,一个硬件设备的唯一标识。而uuid除了表达硬件的唯一标识,还能用来标识软件的标识,比如手机上不同的app的UUID是互斥的android设备怎么获得udid呢?这里面,我们主要目的是想获得一台android设备对一个的一个唯一的标识码,即udid.

2020-08-04 16:08:12 12169

原创 c/c++ pod类型介绍

一、啥是pod类型pod:plain old data,是 C++ 定义的一类数据结构概念,比如 int、float 等都是 POD 类型的。Plain 代表它是一个普通类型,Old 代表它是旧的,与几十年前的 C 语言兼容,那么就意味着可以使用 memcpy() 这种最原始的函数进行操作。基本上谈到这个概念,一般都是说某某 class、struct、union 是不是 POD 类型的。二、pod的特征要求有两个:一个是它必须很平凡、很普通;另一个是布局有序。平凡数据类型拥有平凡的默认构造

2020-07-29 15:44:35 4535 3

原创 GCC likely和unlikely(__builtin_expect)的作用

在Linux2.6内核中,看到一对奇怪的函数,likely(), unlikely()。追踪回去,发现其实是一对宏,如下实现:#define likely(x) __builtin_expect((x), 1)#define unlikely(x) __builtin_expect((x), 0)查了一下是这样说的:例如:if( likely(val)) if( unlikely (val))他们都等于if(val),也就是在理解上来说,是等价的。那么为什么要这样用呢?__

2020-07-10 14:44:15 1823

原创 linux shell命令批量去除文件名中的空格

rename 's/ /_/g' *上述命令可以将当前文件夹内所有文件的名字中得所有空格替换为_。其中g代表所有,如果不加g,如果文件名字中有多个空格,仅替换第一个。参考:shell下批量出去文件名中的空格...

2020-07-03 17:20:51 5020 3

原创 c++程序链接阶段:undefined reference to xxx function(未定义引用问题)原因解析

问题分析c++程序,在链接阶段,当你的程序引用了第三方库中定义的函数时(程序内部定义的函数不涉及这个问题,因为函数的实现已经在自己的代码段、数据段中了),连接器会在三方库中搜索当前符号表中未定义的符号(这些未定义的符号需要在三方库中定位到,否则就会出现对xxx函数未定义引用),当在三方库的符号表中找不到对应的符号时,就会报undefined reference to xxx function。注意,当遇到这个问题时,首先要排除是否三方库有没有被正确链接。当三方库没有被正确链接时,报的错误通常是“can

2020-06-28 11:52:34 3687

原创 ubuntu 14.04 wifi peap 选择证书问题

如题,每次在公司连接wifi,都要选择证书,甚至会卡在选择证书的页面,导致wifi无法继续连接。解决方案:无线不断要求WiFi密码和CA证书参考: ubuntu下WiFi链接出现需要ca证书的问题

2020-06-22 16:59:37 801

转载 【转】图像处理中Stride的理解

一行有 11 个像素(Width = 11), 对一个 32 位(每个像素 4 字节)的图像, Stride = 11 * 4 = 44.但还有个字节对齐的问题, 譬如:一行有 11 个像素(Width = 11), 对一个 24 位(每个像素 3 字节)的图像, Stride = 11 * 3 + 3 = 36.为什么不是 Stride = 33? 因为它是按 4 字节对齐的.根据上面道理, 我们可以手动计算 Stride 的值:1、Stride = 每像素占用的字节数(也就是像素位数/8) *

2020-06-11 18:59:23 869

原创 利用c++/opencv读取并显示raw图像

raw图像,opencv的imread不支持直接读入,但可以通过c++的ifstream读入。注意的一点是,读取时,mode要设置成std::ios::binary,即把raw图像当做二进制文件读入。读取后,构造opencv mat,并显示出来,代码如下: // open raw data const std::string file_path = "/home/zhangshan/image/image.raw"; std::ifstream fin; // 注意,这里要

2020-06-09 11:06:31 8131 3

原创 c/c++依赖静态库、动态库符号问题

一些结论:liba.so / liba.a对应cppint subfunc(int a, int b) { return a + b; } int funcA(int a, int b) { return subfunc(a, b); }符号信息liba.so: func_sub, func_alibB.so / ...

2020-04-29 13:47:47 3460 1

原创 c++11 最简单的线程安全的单例模式(利用local static)

C++11规定了local static在多线程条件下的初始化行为,要求编译器保证了内部静态变量的线程安全性。在C++11标准下,《Effective C++》提出了一种更优雅的单例模式实现,使用函数内的 local static 对象。这样,只有当第一次访问getInstance()方法时才创建实例。这种方法也被称为Meyers’ Singleton。C++0x之后该实现是线程安全的,C++0x...

2020-04-28 11:44:02 4799

原创 [转]宏的高级使用 #, ##, __VA_ARGS__, __FILE__, __FUNCTION__

文章目录一 常见宏概念二 常见宏的使用1.字符串化```#```2.宏连接符```##```3.宏变量解析重点:编译过程一 常见宏概念先说一下本文中会提到的内容:#,##,__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__等#: 把语言符号转换成字符串 ,字符串化(stringizing)##: 宏连接符__VA_ARGS__:...

2020-04-15 11:22:10 209

原创 [转]符号表是啥?strip去符号去了啥?

Reference:符号表是啥?strip去符号去了啥?在程序编译成可执行文件后,这个文件中会有一个表专门来保存函数名,变量名,段名和代码或者数据的对应关系,这个表就是符号表。符号表在链接时起着按符号寻址的作用,但在运行的时候就没有什么作用了,因此这个表即使去掉之后,也并不会影响程序的运行。但是如果是动态链接的函数,比如用到了libc的printf函数,那么这个printf符号如果去掉了,在...

2020-04-15 10:48:30 1530

原创 valgrind检查c/c++程序内存问题

简介:Valgrind 可以用来检测程序是否有非法使用内存的问题,例如访问未初始化的内存、访问数组时越界、忘记释放动态内存等问题。实战:valgrind --tool=memcheck --leak-check=full --vex-guest-max-insns=25 --show-leak-kinds=all -v --log-file="memcheck.txt" 解释下--ve...

2020-04-14 20:05:03 297

原创 uvc和v4l2简介

对这块不是特别理解,看了几篇博客,还是一知半解,先记录下,以后有机会深入后,再来更新;UVCUVC全称为USB Video Class,即:USB视频类,是一种为USB视频捕获设备定义的协议标准。UVC是一个开放的标准,拥有维护良好的驱动,它属于内核代码的一部分。插入摄像头后就可以工作,而无须编译或安装额外的驱动。V4L2简单的讲V4L2就是用来管理UVC设备的并且能够提供视频相关的...

2020-03-11 20:05:27 968

原创 adb remount 系统提示只读文件系统Read-only file system,解决用adb disable-verity

在Android 9.0,能对system分区进行操作,提示没有写权限,为只读文件系统Read-only file system,并且adb root->adb remount时,adb remount会报错。解决方法如下.执行如下命令adb rootadb disable-verity(最新的adb 工具包才支持adb disable-verity命令,比如我ubuntu 14...

2020-03-11 11:05:57 2716

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除