自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

吴尼玛cs

记问之学

  • 博客(79)
  • 收藏
  • 关注

原创 《More Effective C++》技术篇——将constructor和non-member function虚化

所谓virtual constructor是某种函数,视其获得的输入,可产生不同类型的对象。有一种特别的virtual constructor——所谓virtual copy constructor——也被广泛地运用、virtual copy constructor会返回一个指针,指向其调用者(某对象)的一个新副本。基于这种行为,virtual copy constructor通常以copyself或cloneself命令,或者直接命名为clone。当derived class重新定义其base cl.

2021-10-17 18:27:28 1

原创 音视频基础知识点

音频PCM:脉冲编码调制(Pulse Code Modulation)。通过采样、量化、编码将模拟信号转换为数字信号。根据奈奎斯特采样定理:为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍。采样率:即采样的频率。因为采样率要大于原声波频率的2倍,而人耳能听到的最高频率为20kHz,所以为了满足人耳的听觉要求,采样率至少为40kHz,通常为44.1kHz,更高的通常为48kHz。采样位数:波形振幅在模拟信号上也是连续的样本值,而在数字信号中,信号一般是不连续的,所以模

2021-10-07 16:19:11 18

原创 Vim基本操作

简介Vim是Linux中一款常见的文本编辑器。本文将简单介绍一下Vim的基本使用方式。Vim编辑器有三种模式——命令模式、编辑模式、末行模式。三种模式的切换方式如下图:需要注意的是:编辑模式和末行模式之间不可直接切换。命令模式vim filename可直接新建文件,打开文件后默认进入命令模式。命令模式下可以移动光标或者进行删除、复制、粘贴。移动光标常用命令:方向键或者h(左)、j(下)、k(上)、l(右):光标移动一个字符。[Ctrl] + [f]:向下翻页。[C

2021-10-05 17:44:10 14

原创 linux目录、文件操作命令

命令基本格式命令格式:cmd [-options [parameter]] [file]cmd :命令名,如ls,cd等。[]:表示可省略内容。-option:选项,用于控制命令。格式有2种:-h、–help。parameter:给不同选项的设置的参数。file:执行命令的文件或目录。目录操作pwd:显示当前目录的绝对路径。cd:切换目录。示例:cd .. #切换到上级目录cd ~ #切换到用户根目录cd - #返回上次的工作目录ls:显示目录内容。常用参数:

2021-10-05 17:43:04 6

原创 linux动态库搜索路径顺序

在linux中执行程序时,有时会遇到“error while loading shared libraries”这种错误,这是因为动态链接器ld无法找到程序启动需要的动态库。这时就需要设置动态库的搜索路径了。动态链接器ld搜索路径的顺序以及如何设置:ELF文件中Dynamic Section段的DT_RPATH设置的路径。例如,可以在编译时添加链接参数“-Wl,–rpath,./lib”来指定搜索./lib。环境变量LD_LIBRARY_PATH设置的路径。ELF文件中Dynamic se..

2021-10-03 16:24:20 7

原创 Linux中获取当前进程的绝对路径

通过readlink的方式获取。bool GetExePath(std::string &path){ std::string exe_path(PATH_MAX, std::string::value_type()); auto exe_path_len = readlink("/proc/self/exe", &exe_path[0], exe_path.size()); if (exe_path_len < 0) { std::ce.

2021-10-03 16:22:57 6

原创 Python中执行cmd

使用os.system()方法os.system用来执行cmd指令,在cmd输出的内容会直接在控制台输出,返回结果为0表示执行成功。示例代码:# coding:utf-8import osos.system("ls")PS:os.system()方法是简单粗暴的执行cmd指令,没有办法获取到cmd输出的内容。PPS:os.system()方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后.

2021-09-25 18:36:09 6

原创 Linux程序中集成breakpad

项目介绍breakpad是google开发的一个跨平台C/C++ dump捕获开源库,崩溃文件使用微软的minidump格式存储,也支持发送这个dump文件到服务器,breakpad可以在程序崩溃时触发dump写入操作,也可以在没有触发dump时主动写dump文件。breakpad支持windows、linux、macos、android、ios等。目前已有Google Chrome, Firefox, Google Picasa, Camino, Google Earth等项目使用。主页:https

2021-09-06 20:08:22 29

原创 关于Linux的core dump那些事

什么是core?在linux中,程序运行时出现异常崩溃,操作系统会将程序当时的内存状态、调用堆栈等信息保存在core文件中。这种行为就是core dump(核心转储)。core文件中一般会保存寄存器信息(包括程序指针、栈指针等)、内存管理信息、CPU和操作系统状态和以及函数调用堆栈等信息。所以,core文件对于开发人员是非常重要的,很多时候我们都需要依赖对core文件的分析结合日志来定位和解决崩溃的问题。core dump相关设置在linux中,core dump的一些相关设置方法:查询:ulim

2021-08-29 13:53:24 17

原创 Shell脚本在当前终端添加环境变量的正确姿势

在Linux中我们经常需要设置一些环境变量,设置环境变量的方式有很多,有些是对当前用户有效的,有些是对所有用户有效的,有些是永久的。很多时候我们会有这样的需求,只要在当前终端中让设置的环境变量生效,这样退出该终端后不影响其他程序的运行。一般可以通过export命令来设置环境编写,比如设置动态库加载路径export LD_LIBRARY_PATH=./lib。如果需要配置的环境变量很多,或者每次做某件工作前都得配置这些环境变量,这时通过手动输入命令的方式就很不方便了,这时就需要shell脚本登场。我们.

2021-08-22 18:27:31 31

原创 linux环境变量设置

在Linux中我们经常需要设置一些环境变量,下面列举一些常见的环境变量设置方式。读取环境变量export :显示当前系统定义的所有环境变量echo $PATH :输出当前的PATH环境变量的值设置环境变量之当前终端:export PATHexport PATH=/you/bin/path:$PATHps:设置的环境变量中不要忘了加上原来的配置,即$PATH部分,避免覆盖原来配置。生效时间:立即生效生效期限:当前终端有效,窗口关闭后无效生效范围:仅对当前用户有效设置环境变量.

2021-08-22 18:26:15 105

原创 Chromium headless模式开发的一切

获取和编译chromiumLinux:https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/linux/build_instructions.mdWindows:https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/windows_build_instructions.mdMac:https://chromium.googlesou

2021-08-09 18:56:35 33

原创 centos7安装、升级、切换gcc

安装gccyum install gccyum install gcc-c++升级gccx.x.xwget https://ftp.gnu.org/gnu/gcc/gcc-x.x.x....tar -xzvf gcc-x.x.x.tar.gzcd gcc-x.x.x./contrib/download_prerequisitesmkdir buildcd build../configure --prefix=/usr/local/gccx.x.x --enable-languages=

2021-08-08 18:51:57 39

原创 Linux脚本错误:没有那个文件或目录

linux下执行脚本的时候报错:没有那个文件或目录。ls看一下,是有文件的。原因:文件格式错误。首先,vim filename查看文件。然后用命令 :set ff看文件格式。可看到dos或unix的字样,如果的确是dos格式的,需要改成unix的。通过命令set ff=unix来修改,,然后保存退出后就可以运行了。...

2021-08-08 18:43:56 29

原创 Python脚本监控Linux用户CPU使用率

实现功能:启动后自动运行,每秒打印一次用户CPU使用率,结束脚本时自动计算并打印平均值和最大值。#!/usr/bin/python# -*-coding: utf-8 -*-import subprocessimport osimport timecmd = "top -bn 1 | grep 'Cpu(s)' | awk -F'[\" \"%]+' '{print $3}'"count = 0total = 0.0max_use = 0.0try: while

2021-08-01 18:36:53 23

原创 Linux命令后台运行

Linux后台运行命令有两种方式:cmd & : 后台运行,关掉终端会停止运行nohup cmd & : 后台运行,关掉终端不会停止运行方式一:cmd &cmd & 实现让命令在后台运行。但不要将有用户交互的命令放到后台,这样命令会在后台等待用户输入。后台运行的命令也会将结果输出到控制台上,如果不需要的话,可以将其重定向到某个文件中。使用下面的命令可以将标准输出和错误输出都将被重定向到一个叫做cmd.out的文件中:cmd > cmd.out 2

2021-07-17 11:05:10 947

原创 Linux命令行非法字符处理

Linux命令中像$、&这样的属于非法字符,如果只想在命令里面将这些特殊字符作为一般的符号显示怎么办?需要使用引用,Linux 中有三种引用方法。用双引号 “” 括起来,不过这对 “$” 无效。echo “Today is $(date)”用单引号 ‘’ 括起来,停止所有特殊字符的功能。echo ‘Today is $(date)’反斜杠 \ 转义,这在很多场合都有通用的。echo “Today is $(date)”输出:[root@localhost ~]# ec

2021-07-04 18:06:05 47

原创 Linux防火墙相关命令

查看状态、开启、重启、关闭firewalld.service服务# 查看状态service firewalld state# 开启service firewalld start# 重启service firewalld restart# 关闭service firewalld stop查看防火墙规则firewall-cmd --list-all 查询、开放、关闭端口# 查询端口是否开放firewall-cmd --query-port=8080/tcp# 开放80端口fir

2021-07-04 18:03:14 9

原创 CentOS7安装中文字体

问题用DevTools调试虚拟机中的headless模式的chromium时发现调试窗口显示的都是□□□(除了英文字符),一查发现是因为虚拟机中的CentOS自带的只有英文字体,不包含中文字体,要显示中文字符需要我们自己安装中文字体。字体库相关命令如果/usr/shared目录没有fonts和fontconfig目录,则需要先安装字体库,输入命令:yum -y install fontconfig安装完成后可以查看已安装的字体,输入命令:fc-list也可以查看已安装的中文字体,

2021-07-01 19:30:32 59

转载 基于 Web 引擎技术的 Web 内容录制

最近学习音视频相关技术看到一个很好的技术分享,实现了基于Chromium的web内容录制。现在分享出来大家一起学习一下。B站视频:声网Agora Web 引擎高级架构师 高纯:Web 互动场景还原——基于 Web 引擎技术的原文链接:https://blog.csdn.net/agora_cloud/article/details/110913869原文内容:随着基于WebRTC技术的Web应用快速成长,记录web在线教育、视频会议等场景的互动内容并对其准确还原越来越成为一项迫切需求。在主流浏览器中

2021-06-24 18:47:14 30

原创 调整VirtualBox虚拟磁盘VDI文件空间大小

之前,使用 VirtualBox 创建了一个 CentOS 虚拟机,划分了 40GB 的磁盘空间,用的是动态分配存储的方式,文件系统为 LVM。后来发现磁盘容量不够用了。经过一番折腾,终于给 VirtualBox 的虚拟机增加了虚拟磁盘容量,并让 CentOS 的 LVM 将其利用上。特此记录一下。Windows CMD 命令.\VBoxManage.exe modifyhd YOUR_HARD_DISK.vdi --resize SIZE_IN_MB其中参数 YOUR_HARD_DISK.vdi

2021-06-23 16:10:13 57

原创 C++11的condition_variable实现WaitForSingleObject功能

在多线程程序开发中,我们有时会希望等待其他线程结束后在继续执行某些任务。比如常见的,主线程需要等待其他所有子线程结束后再结束程序。在Windows下我们一般使用WaitForSingleObject,或者WaitForMultipleObjects来实现,它们都会等待Object被设置为有信号时才返回的。这样我们在主线程结束的地方wait,在子线程结束的地方设置信号,就能实现上述功能。但是这个API是Windows下的,无法跨平台使用。还好C++11为我们带来了多线程的支持。在C++11中我们可以通过m.

2021-04-24 16:22:38 79

原创 Linux命令行参数解析——getopt_long

在linux中,一切皆文件,所有的可执行程序都可以通过命令行启动,程序启动时通常都会带上各种参数以控制程序的行为。所以解析命令行参数通常是一个可执行程序的第一步,下面就来介绍下经常用到的命令行参数的解析函数——getopt_long。我们先来了解一下命令行参数。命令行参数可以分为两类,一类是短选项,一类是长选项。在命令行中"-“表示短选项,”–"则表示长选项。例如,在linux中最常用的ls命令中“-a,-A,-b”都是短选项,而它们对应的长选项则是“–all,–almost-all, --esc..

2021-04-18 10:15:23 11

原创 CMake编译遇到这种ABI不兼容问题不要慌

最近,在Linux下使用CMake编译程序的时候遇到一个问题,特此做一个记录。事情是这样的,我编译的程序使用了2个第三方库,在写好CMakeLists后,启动编译,然后就报链接错误,一直报一堆找不到定义。类似这样的一堆:‘***** std::__cxx11 *******’未定义的引用我仔细检查代码和CMakeLists,各种修改尝试无果。最后,在同事和搜索引擎的帮助下终于找到问题所在了。问题出在我使用的GCC和第三方库编译的时候使用的GCC版本差异太大,两者的ABI不兼容。参考GCC提供的

2021-04-05 17:20:21 293

原创 C++大厂面试真题

C++标准库的map和set有什么区别,如何实现的?map和set都是C++的关联容器,其底层实现都是红黑树。map和set区别在于:map中的元素是key-value(键-值)对:关键字起到索引的作用,值则表示与索引相关联的数据;set是关键字的简单集合,set中的元素都只包含一个关键字。set的迭代器是const的,不允许修改元素的值;map允许修改value,但不允许修改key。其原因是map和set是根据关键字排序来保证其有序性的,如果允许修改关键字的话,那么首先需要

2021-04-03 15:42:45 212

转载 如何理解虚拟内存

为什么不直接使用物理内存虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。现代所有用于一般应用的操作系统都对普通的应用程序使用虚拟内存技术,老一些的操作系统,如DOS和1980年代的Windows,或者那些1960年代的大型机,一般都没有虚拟内存的功能——维基百科读完上面的信息,我们可以得知,虚拟内存这个概念是后来才提出的,一开始并没有虚拟

2021-03-15 11:37:52 47

原创 《More Effective C++》总结笔记(三)

效率条款16:谨记80-20法则80-20法则说:一个程序80%的资源用于20%的代码身上。是的。80%的执行时间花在大约20%的代码身上,80%的内存被大约20%的代码使用,80%的磁盘访问动作由20%的代码执行,80%的维护力气花在20%的代码上面。不必拘泥于法则的数字,其基本重点是:软件的整体性能几乎总是由其构成要素(代码)的一小部分决定。从某个角度看,80-20法则暗示,大部分时候你所产出的代码,其性能坦白说是平凡的,因为80%的时间中,其效率不会影响系统整体性能。或许这不至于对你的自尊心

2021-03-07 14:20:52 40

转载 C++程序core dump分析

一、前言对于C/C++程序员而言,在开发程序的过程中,遇到的最多的程序问题莫过于程序core dump了,也就是常说的程序core了。那么程序出core的情况有哪些的?如果程序core了之后,我们应该如何对这类问题进行定位呢?本文给出了程序出core的常见原因和定位方法。二、 问题分类及定位方法为了给大家一个直观的认识,我们首先分析一下程序出core的常见原因及分类方法。通过这些分类,我们可以对分core的原因、定位方法有初步的认识。通常在程序出core之后,最常用的工具就是gdb,通过

2021-02-19 15:44:04 265

原创 青蛙跳问题为什么是斐波那契数列

在面试中我们可能会遇到青蛙跳的问题:一只青蛙一次可以跳上一级台阶,或者跳上二级台阶。那么如果总共有N级台阶,问这只青蛙总共有多少种跳法?首先,我们考虑最简单的情况,如果只有一级台阶,那显然青蛙只有一种跳法。如果只有二级台阶,那么青蛙就有两种跳法,一种是每次跳一级,总共跳二次,另一种就是直接跳二级。接下来,再来看N级的(N大于2)的情况。我们先把N级台阶的跳法看做一个N的函数,记为f(N)。考虑N>2时,第一次跳就有两种跳法,一种是第一次只跳一级,此时跳法数就是后面剩下的N-1级台阶的跳..

2021-02-15 11:44:18 39

原创 《More Effective C++》总结笔记(二)——异常

异常条款9:利用destructors避免泄露资源只要坚持这个规则,把资源封装在对象内(类似智能指针shared_ptr),通常便可以在exceptions出现时避免泄露资源。简单来说就是,当有资源可能在函数抛异常时而无法释放,这时可以将资源封装到对象内(RAII),利用对象的析构函数来自动释放资源,这样即使有exceptions发生,也不会有资源泄露。条款10:在constructors内阻止资源泄露(resource leak)C++只会析构已构造完成的对象。对象只有在其construc

2021-02-05 16:40:06 15

原创 C++程序性能优化指南

原则《More Effective C++》书中效率部分第一条就是80—20准则。说得是——大约 20%的代码使用了 80%的程序资源;大约 20%的代码耗用了大约 80%的运行时间;大约 20%的代码使用了 80%的内存。因此,一些简单的优化也能显著提高程序性能。先完成程序功能,再考虑性能优化的事,否则会出现代码可读性差,过度抽象等问题。大部分的性能优化其实都是在做时间和空间的权衡,空间换时间,或者时间换空间。良好的代码风格和代码规范能有效的避免性能问题的出现,所以coderevi

2021-01-31 19:17:42 97 4

原创 PC客户端离线安装包和下载器安装包的优劣点

目前,PC客户端软件所使用的主流的安装包有2种,一种是离线安装包,一种是下载器安装包(以下简称下载器)。离线安装包最大的优点是安装快(只涉及解压),但其实你从官网下载离线安装包的用时和你用下载器下载安装的用时是理论上来说是差不多的。只是离线安装包的耗时主要在浏览器(或者其他渠道,比如360软件管家),下载器主要耗时在我们安装程序中。离线安装包还有一个好处是如果我们把它放到360软件管家之类的市场,用户安装的时候就走的是他们的流量,会节省我们的流量。那么为什么现在大部分软件都采用下载器的..

2021-01-24 16:37:05 178

转载 Windows多线程编程

前言熟练掌握Windows下的多线程编程,能够让我们编写出更规范多线程代码,避免不要的异常。Windows下的多线程编程非常复杂,但是了解一些常用的特性,已经能够满足我们普通多线程对性能及其他要求。进程与线程1. 进程的概念进程就是正在运行的程序。主要包括两部分:一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。另一个是地址空间,它包含所有可执行模块或 DLL 模块的代码和数据。它还包含动态内存。2. 线程的概念线程就是描述进

2021-01-22 16:53:52 60

原创 c++关键字typeid

typeid是c++的一个关键字,typeid操作符的返回结果是标准库类型type_info对象的引用。但是,C++标准并没有明确定义type_info,其具体实现依赖于各个编译器。标准只规定了typeid操作符必需实现如下四种操作:操作说明t1 == t2如果两个对象t1和t2类型相同,则返回true;否则返回falset1 != t2如果两个对象t1和t2类型不同,则返回true;否则返回falset.name()返回类型的C-style字符串。由编..

2021-01-15 17:36:36 60

原创 一文读懂C++内存对齐

操作系统64位和32位有什么区别?64位操作系统意味着其cpu拥有更大的寻址能力。理论上来说,其性能相比于32位操作系统会提升1倍。但是这也需要在64位操作系统上运行的软件也是64位的。软件中数据类型的的字节数大小其实和操作系统是多少位的没有关系,而是由编译器决定的。也就是说数据结构占多少位取决于在软件编译时我们选择的是64位还是32位的编译器。其具体占位数在编译器已经决定了。数据类型对应字节数下面是不同位数编译器下基本数据类型对应的字节数。32位编译器:char :1个字节char*

2021-01-10 21:21:52 26

原创 《More Effective C++》总结笔记(一)——基础议题、操作符

基础议题条款1:仔细区别pointers和references首先你必须认知一点,没有所谓的 null reference。由于reference一定得代表某个对象,C++因此要求references必须有初值。Pointers和references之间的另一个重要差异就是,pointers可以被重新赋值,指向另一个对象,reference却总是指向(代表)它最初获得的那个对象。结论:当你知道你需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符而其语法需求无法由pointers

2020-12-25 17:13:25 37

原创 C++11拾穗

C++11新关键字alignas:指定对齐大小alignof:获取对齐大小decltypeauto(重新定义):可作为返回值类型后置时的占位符static_assert:静态断言using(重新定义):类型别名或者模板别名noexcept:声明函数不可以抛出任何异常export(弃用,不过未来可能留作他用)nullptrconstexpr:可在在编译期确认的常量表达式thread_local:等价于TLS快速初始化成员变量C++11中支持使用等号 = 或者花括号 {} 进行就地的(

2020-12-23 15:57:30 40

原创 c++11强化知识点

初始化列表(std::initializer_list)c++11提供了std::initializer_list,将使得类对象的初始化也可以和普通数组或者POD数据一样使用初始化列表的方式。只要为类对象提供初始化列表构造函数即可。std::initializer_list也可以作为函数的参数使用。初始化列表std::initializer_list相关示例代码如下。#include <iostream>#include <initializer_list>#incl

2020-11-15 10:00:32 38

原创 《生命中不能承受之轻》笔记

短评★★★☆☆ 我居然把这本书看完了,真是kitsch!!!人永远都无法知道自己该要什么,因为人只能活一次,既不能拿它跟前世相比,也不能在来生加以修正。只能活一次,就和根本没有活过一样。托马斯得出结论:同女人做爱和同女人睡觉时两种互不相关的感情,岂止不同,简直对立。爱情不会使人产生性交的欲望(即对无数女人的激望),却会引起同眠共寝的欲求(只限于对一个女人的欲求)。有同情心(同感),意思就是不仅仅能与苦难的人生活在一起,还要去体会他的任何感情——欢乐、焦急、幸福、痛楚。于是乎这种同情表明

2020-11-13 20:33:00 89

原创 查找代码中所有中文字符的正则表达式

所有中文^((?!(*|//)).)+[\u4e00-\u9fa5]排除注释(".[\u4E00-\u9FA5]+)|([\u4E00-\u9FA5]+.")

2020-11-06 20:26:43 321

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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