自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 记录智能指针和string使用中发现的问题

在c++11中,想要智能指针指向数组,需要这样写intint注意两个shared_ptr和unique_ptr的模板参数不同。但是只有这样写在c++11中才能编译通过。但是在c++11 中, shared_ptr这种写法是有问题的。但是unique_ptr这种做法是正确的。因为shared_ptr的默认删除器是delete,指向数组时模板参数依然是单个元素类型,所以析构会调用delete 而不是delete[], 造成内存或资源泄露解决办法:1:升级到c++17。

2023-02-09 00:02:18 132

原创 单线程压测脚本触发多线程bug

bug定位,多线程,信号

2023-02-08 23:20:34 148

原创 shell批量修改文件

批量修改文件名,有时在linux服务上还是会碰到的,最近笔者就碰到了,记录一下比如我想将所有文件后加上.bak, 可以这么做其中需要注意的是xrags -i 和{}, -i表示一种占位符,从管道读取到的参数会替换掉占位符,一般默认的就是{} ,-i表示使用占位符,也可以用-I(大写的i)指定其他的占位符,所以这行shell意思就很简单了。如果我们想恢复原来的文件名呢,可以这么做:需要注意的可能是两点,sed后面有个2g, 我们知道g表示全部替换,2g表示从第二个匹配项开始,因为第一个匹配项是1

2021-07-12 23:59:09 464

原创 c++一种反射机制,判断类中是否存在特定的函数

c++语言本身并没有提供反射机制,倒是有一个比较基础的RTTI,利用c++的模板特性,SFINAE,可以实现一些反射功能,先看代码:在这里插入代码片

2021-05-30 23:08:56 787 1

原创 C++ SFINAE和 enable_if

c++中的SFINAE和enable_if,如果经常写模板的话,应该听到看到这些东西.SFINAE首先介绍下SFINAE,参考官方介绍,中文是“模板替换失败不是一种错误”,看个代码示例class Test { using newType = int;};// 1template<typename T> void f(T arg) { cout<<"old type"<<endl;}// 2template <typename T>v

2021-05-30 18:14:58 202

原创 C++ 11 decltype 与auto

c++11 新特性中,用的比较多的应该是类型推导了,类型推导有两种,auto与decltype,先说说auto.1: autoauto在使用时,最需要注意的应该auto会去掉CV(const , volatile)属性与引用,细说的话有三种情况:1:auto 后没有引用或指针int a = 1;const int ca = 1;const int &caref = 1;auto a1 = a;auto a2 = ca;auto a3 = caref;template<ty

2021-05-19 00:33:51 97

原创 奇异递归模板模式

奇异递归模板模式(可参见wiki)在一般的编程中应该是不多见的,笔者在书籍上(陈硕的linux 服务器端开发 和more effective中有见过),后来在实际开发中没想到还真的碰到了,这个在元编程中应该还是比较常见的。template <class T> struct Base{ void interface() { // ... static_cast<T*>(this)->implementation();

2021-05-07 23:59:52 251

原创 more effective c++读书笔记 第五章 技术 part2

条款31让函数根据一个以上的对象类型决定如何虚化这里的问题很简单class Base {virtual void funtion( Base& base){}};class A : public base {};class B : public base {};class C : public base {};现在,function 的参数都可能是A B C中的一个,但是不同的参数类型有不同的行为,如何根据参数类型决定funcion中的行为呢。因为是虚函数,所以在函数调用时,如

2021-04-13 00:27:12 91

原创 more effective c++ 读书笔记 第五章 技术 part 1

条款35将ctor和non member func 虚化作者在这里描述了一种场景class Base {}class Deveried1 : Base {};class Deveried2 : Base {};class Com {vector<Base*> vec;};现在想为vec赋值,需要新构造出来对象,但是根据磁盘数据构造,我们这个时候,我们需要一个额外的成员函数,让他来返回不同类型的派生类指针,他的行为好像是 virtual ctor。其实本意很简单,这里

2021-03-30 00:00:00 103

原创 more effective c++ 读书笔记 第四章 效率

条款16谨记80-20法则这里作者谈的多是理念,比如,80%的资源被20%的代码所使用。所以大部分时候,我们所写的代码是平凡的,也就是说,在80%的时间里,他不会对整体效率有影响(有趣了)。大部分人对瓶颈的查找是猜,但是应该用正确的工具来测量。条款17考虑使用lazy evaluation惰性求值的意思就是只有在被真正使用时才去做计算,比如写时复制这种特性。作者举了个例子:如string s1 = “hello”string s2 = s1;strng ctor 一般会使得s2拥有s1的副

2021-03-14 14:05:02 111

原创 more effective c++读书笔记 第二章 操作符

条款5对定制的类型转换函数保持警觉在class中可定制两种类型转换函数,一个是单自变量的构造函数(如果带默认参数,可以有多个变量),二是operator 类操作符的重载,这里的内容较基础。对于单自变量构造函数,现在可以用explicit 关键字,要求显示构造,即可避免默认的转换行为,对于不支持explicit的编译器,作者提供了一种做法class Array {public: class ArraySize { public: ArraySize(int s) : size(s) {}

2021-03-08 00:11:20 120

原创 more effective c++ 读书笔记 第一章

more effective c++ 读书笔记 第一章 :基础议题条款一仔细区别pointers和references区别指针和引用,没什么好说的,基础知识。不过有个有趣的问题,之前没有考虑过:char *pc = 0;char* ref = *pc本质上,还是说对空指针、 野指针解引用,然后绑定到对象上,这样对,是未定义的。条款二使用c++类型转换符这部分较为基础,值得注意的是,dynamic_cast 用于向下转型,如果指针转换失败,返回nullptr, 如果是引用,抛出异常。另外

2021-03-07 21:51:00 157 2

原创 shell中比较[]、test、[[]] 数字和字符串

比较写shell脚本时,if判断是经常需要使用的,shell中的比较有很多中,眼花缭乱,今天把常用的比较梳理一下[] 和test这两个其实是等价的,都是shell 内建命令,不过linux环境本身也提供了一个test命令,这个是外部命令,不过大多数情况下,我们调用的都是内建的testroot@LAPTOP-2MOIS3PQ:/home/li# type [[ is a shell builtinroot@LAPTOP-2MOIS3PQ:/home/li# type testtest is a

2020-11-21 21:59:32 332

原创 shell中的进程替换process substitution >() <()

进程替换shell中的进程替换是一个有意思的语法,语法很简单<(cmd)>(cmd)注意,这里的>和()之前不能有空格,否则就变成了重定向和开启子进程了。<(cmd)的意思是将括号内的命令输出到一个临时文件如:root@LAPTOP-2MOIS3PQ:/home/li# diff <(ls) <(ls -a)0a1,9> .> ..> .bash_history> .bash_logout> .bashrc>

2020-11-21 14:17:20 385

原创 shell中的$

shell中的$符号用的很多,今天来梳理一下:运算:可以用$(()) 来实现变量的计算,支持四则运算,括号优先级,移位,注意,bash内置的运算都不支持小数,可以用awk,bc等工具来实现$[],同$(())位置参数:一般我都会在awk和bash中使用:在awk中,$0代表整行,1...1 ...1...N对应那一行的第几列,在awk中有时会想用某个变量值代表$N中的数据,测试发现可以这么写:a=1; awk '{print $'\$a'}' file_name$a也是用单引号括起来的,这

2020-11-21 13:39:02 619

原创 ldd输出解释

ldd命令用来查看二进制文件所依赖的动态库,大家经常使用,ldd命令的输出却有些让人迷惑如:root@LAPTOP-2MOIS3PQ:/home/li# ldd `which ls` linux-vdso.so.1 (0x00007fffd7cf7000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fbc41220000) libc.so.6 => /lib/

2020-11-10 00:28:27 1612

原创 再说linux命令行的管道

linux管道linux命令上的管道大家想必是经常用了 cat 1.txt | grep xxx; 这是常见的用法,说说管道,pipe是 liunx上常见的IPC方法,在 linux system programming 中有两种,有名管道和无名管道,有名管道可以用在任意两个进程,而无名管道只能用在有亲属关系的进程,如我们一般所写的命令行就是无名管道(我猜是,不知道shell会怎么做,当然可以不是:) )。管道是需要内核来做一些维护工作的(无名管道显然是进程持续性,但有名管道是不是呢,记不清,请翻阅un

2020-11-08 01:50:13 3282 6

原创 lzma算法

lzma算法分析这几天在公司主要在做压缩相关,记录一下所得。目前业界主流的压缩算法感觉并不多,好用的就Huffman,lz系列,其他的像差分编码,vlq编码,感觉只能做个数据预处理,或者一种小范围的压缩。lz系列有很多,主要有lz77 lz78 lzma,基本思想是一样的,都是一种字典编码,如,我有一段文本,里面有“abcdefabcde”,那么后面的abcde并没有必要,可以用前面的替代,所以,其实可存储为“abcd65”,6代表offset,5代表length,既用距离当前位置6字节,长度为5的字

2020-11-08 01:20:48 4209

原创 awk学习记录

awk小计##记录一下学习awk的东西awk进行流处理,我们一般主要是对列对象进行一些操作。awk命令格式:awk ‘pattern’ ‘action’ filename;其中pattern 代表匹配模式,如,我想匹配文件中的出现“test”的行,则可以写成,awk /test/ ‘{print $0}’ 1.txt;所有要进行的操作即action,要写成形如‘{}’的格式,‘’所包含的内容可以有这种格式:‘BEGIN …{} END…’,其中begin和end是在处理文本之前和之后可进行的操

2020-11-08 00:39:51 185

空空如也

空空如也

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

TA关注的人

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