自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

7now_的博客

代码即人生

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

原创 Golang Assertion

Go中所有的类型都可以被转化成interface{},通常在传入可变参数中的API中,可变参数的类型就是interface{}。func typeConversion(strs ...interface{}) (ret []string) { for _, s := range strs { ret = append(ret, string(s)) }}上述代码是不能运行的,错误为...

2019-07-28 17:28:13 314

原创 XRDP使用

很久没写博客了,最近公司测试使用到了远程桌面,花了一点时间研究了一下,记录一下心得。XRDP介绍Xrdp是一个开源工具,允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP之外,xrdp工具还接受来自其他RDP客户端的连接,如FreeRDP,rdesktop和NeutrinoRDP。 Xrdp现在支持TLS安全层。linux服务器环境搭建我使用的是cent...

2019-05-18 22:18:39 12367 1

原创 非递归快排

非递归快排通过使用栈来模拟函数栈的调用,每次将首尾指针存入到栈中,并对首尾之间区域进行快排。#include <iostream>#include <stack>#include <vector>using namespace std;//利用栈将序列的起始和末尾保存起来int partition(vector<int> &am...

2018-07-27 00:02:30 390

原创 C++虚函数和虚函数表原理

虚函数的地址存放于虚函数表之中。运行期多态就是通过虚函数和虚函数表实现的。类的对象内部会有指向类内部的虚表地址的指针。通过这个指针调用虚函数。虚函数的调用会被编译器转换为对虚函数表的访问:ptr->f(); //ptr代表this指针,f是虚函数*(ptr->vptr[1])(ptr);上述代码中,ptr代表一个this指针,ptr指向的vptr是类内部的虚表...

2018-07-26 19:49:54 44307 13

原创 第八章 微调

四十一 针对可复制的形参,在移动成本低并且一定会被复制的前提下,考虑将其按值传递当构造函数需要对左值和右值进行分别处理的时候,我们有两种方法,一种是重载接受左值和右值的构造函数,另一种是写万能引用构造函数,这两种方法都有一定的局限性,左值右值重载构造函数会导致代码的冗余,而万能引用会匹配一些错误的类型。有一种新的方式,就是使用按值传递,函数内部将局部变量强转为右值进行移动构造。代码如下:...

2018-07-19 13:41:05 273

原创 第七章 并发API

C++11将并发融入了语言和库中。三十五 优先选用基于任务而非基于线程的程序设计基于线程的设计就是使用std::thread来运行函数;基于任务的设计就是使用std::async来运行函数。int f();thread(f); //基于线程auto r = async(f); //基于任务使用async调用f的时候,传递给async的函数对象被看做是任务。在基于线程的调...

2018-07-18 16:36:46 496

原创 第六章 lambda表达式

lambda表达式是表达式的一种,它是源代码的组成部分。std::find_if(container.begin(), contianer.end(), [](int val){ return 0 < val; });闭包是lambda表达式创建的运行期对象,根据不同的捕获模式,闭包会持有数据的副本或者引用。闭包类就是实例化闭包的类,每个lambda式都会出发编译器生成一个独一无...

2018-07-15 21:48:48 748

原创 第五章 右值引用、移动语义和完美转发

移动语义使得编译器可以将一些代价高昂的复制操作转移成移动操作。例如STL中的很多复制操作。移动构造函数和移动赋值运算符可以使用移动语义,创建只移对象成为可能,例如shared_ptr、unique_ptr和thread等等。完美转发使得人们可以撰写接受任何实参的模板函数,并将其转发到其他函数,目标函数会接受到与转发函数所接受的完全相同的实例。二十三 理解std::move和std::for...

2018-07-12 15:07:29 764 1

转载 dpdk无锁队列

这篇博客是从网上博客整理摘抄而来,具体参考的博客内容在文末给出。Linux无锁队列kfifo概述Linux内核中有一个先进先出的数据结构,采用环形队列的数据结构来实现,提供一个无边界的字节流服务。最重要的是,这个队列采用的是无锁的方式来实现。即当它用于只有一个入队线程和一个出队线程的场景时,两个线程可以并发操作,而不需要任何加锁行为,就可以保证kfifo的线程安全。 这个队列名为k...

2018-07-09 17:45:51 5506

原创 dpdk存储系统

NUMA系统简介普通的南北桥系统里面主要是通过北桥进行数据的交换,这样系统的瓶颈在北桥中,NUMA(非一致性内存架构Non-Uniform Memory Architecture)系统可以解决这样的系统瓶颈。在这种架构下,在一个配有四核的机器中,不需要一个复杂的北桥就能将内存带宽增加到之前的四倍,这样有一个问题就是该系统中,访问内存花费的时间和处理器相关,之所以和处理器相关是因为该系统每个处理...

2018-07-09 17:44:00 527

原创 第四章 智能指针

智能指针裸指针问题如下:裸指针在声明中并未指出,裸指针指涉到的是单个对象还是一个数组。裸指针在声明中也没有提示是不是要对其进行虚构。换言之,无法得知指针是否拥有其指涉的对象。或者是否空悬指针的析构是不是拥有重载的delete操作符。要防止多于一次的释放和析构。C++存在的4种智能指针: std boost 功能说明 auto_ptr(C++98)...

2018-07-09 15:36:09 523 1

原创 dpdk线程亲和性

Linux对线程的亲和性是有支持的,在Linux内核中,所有线程都有一个相关的数据结构,称为task_count,这个结构中和亲和性有关的是cpus_allowed位掩码,这个位掩码由n位组成,n代码逻辑核心的个数。Linux内核API提供了一些方法,让用户可以修改位掩码或者查看当前的位掩码。sched_set_affinity(); //修改位掩码sched_get_affinit...

2018-07-04 21:13:51 2583

原创 第三章 转向现代C++

七 在创建对象时注意区分()和{}C++11中多了一种初始化的方式,就是通过{}来进行初始化,例如初始化一个int类型int x(0);int y = 0;int z{0};int z = {0};使用大括号初始化容器非常方便:vector<int> vec{1,2,3};大括号同样可以用来初始化类内非静态成员变量,当然也可以用=初始化,但不可以用()...

2018-07-04 19:06:07 931

原创 背包问题-背包九讲阅读笔记

背包问题0-1背包这是最简单的背包问题,简而言之就是每件物品只有一样,可以取或者不取,对于容量为V的背包,N件物品,每一件都可以尝试放入背包中,那么顺序就是遍历这N件物品,每遍历到一个新的物品,都尝试将当前物品放入背包中,看看是放入后得到的价值高还是不放的价值高,取最高者即可。所以需要一个二维数组w[N][V],这个二维数组中的每一个位置w[i][j]代表的意思是前i个物品在容量为...

2018-07-04 14:34:52 1643 1

原创 C++11多线程实现的一道面试题

题目: 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码。这里涉及到的问题是主线程和子线程之间的切换,也就是说子线程跑一下,然后阻塞,主线程再跑一下,然后在阻塞,如此各循环 50次,注意这里的“各循环”,因为主线程和子线程各自的循环是没有关系的,而是内部各自循环50次。 这里肯定要用...

2018-06-15 12:40:14 2799 3

原创 第二章 auto

五 优先选用auto,而非显示型别声明C++11中的auto可以用来声明变量,其型别都是推导自其初始化产物,所以必须进行初始化,这样可以保证合法初始化。int x; //未进行初始化,编译没有问题,但后续可能有逻辑问题auto x; //未进行初始化,无法通过编译其次可以去掉提领迭代器来声明局部变量时写的超复杂代码://C++0xtemplate<typename T...

2018-06-10 19:04:28 269

原创 第一章 型别推导

第一章 型别推导一 理解模板型别推导函数模板类型如下:template <typename T>void f(ParamType param); //ParamType是一个T相关的类型f(expr); //推导T和ParamType的型别ParamType有三种类型:ParamType是个指针或引用,但不是万能引用ParamType是万能引...

2018-06-10 18:36:32 483

原创 Effective Mordern C++和现代C++的探索

导言现代C++学起来难度稍微大一点,需要更多的精力去查漏补缺,很高兴在2018年,我接触到了许多之前没想过的东西,也谢谢周围的人给我带来的动力。这篇读书笔记将涵盖现代C++(包括C++11和C++14)的部分内容,从《Effective Mordern C++》这本书读到和想到的内容。目录第1章 型别推导 第2章 auto 第3章 转向现代C++ 第4章 智能指针 第5章 ...

2018-06-10 18:34:52 863

原创 dpdk探究1-理解dpdk的运行逻辑

DPDK介绍DPDK主要功能:利用IA(intel architecture)多核处理器进行高性能数据包处理Linux下传统的网络设备驱动包处理的动作可以概括如下:数据包到达网卡设备网卡设备依据配置进行DMA操作网卡发送中断,唤醒处理器驱动软件填充读写缓冲区数据结构数据报文到达内核协议栈,进行高层处理如果最终应用在用户态,数据从内核搬移到用户态如果最终应用在内核态,在内核...

2018-06-04 16:37:58 3306 2

原创 深度探索C++对象模型-第五章

构造、析构、拷贝语意学抽象基类仍然需要一个显式的构造函数以初始化成员变量。纯虚函数的存在纯虚函数可以被静态调用,不可以通过虚拟机制调用。但是纯虚析构函数一定要被定义。因为对于派生类来说,总要调用基类的析构函数,基类不定义析构函数会导致连接失败。一 “无继承”情况下的对象构造Plain OI’ Data类型:C风格结构体类型,无需构造和析构的过程,直接申请内存并复制内...

2018-05-31 19:22:07 264

原创 深度探索C++对象模型-第四章

Function语意学一 成员的各种调用方式1 非静态成员函数非静态成员函数采用隐式传入this指针的方式进行成员的调用。this指针指向对象中的成员。class A{public: A(const A &lhs){ a = lhs.a; b = lhs.b; c = lhs.c; }private:...

2018-05-29 18:36:45 197

原创 深度探索C++对象模型-第三章

Data语意学一 成员变量的绑定如果在类内部和外部出现了同名成员变量,而类的内部在成员变量声明前有内联成员函数的话,会有以下误解:extern float x;class A{public: int func(){ return X; }private: int x;};这里的x不会出现绑定错误的原因,因为C++内部将内联函数放到整个类的后面进行处理,...

2018-05-24 14:50:04 568

原创 深度探索C++对象模型-第二章

构造函数语意学一 默认ctor的构造操作在4种情况下,编译器会为未声明ctor的类合成一个默认的ctor。1 带有默认ctor的成员类对象如果一个类内含一个或一个以上的成员类对象,那么类的每一个ctor必须调用每一个成员类的默认ctor,编译器会扩张已经存在的ctor,在其中插入一些代码,使得用户写的代码被执行前,先调用必要的默认ctor。调用的顺序是这些类对象在类中声明的顺序...

2018-05-23 16:56:44 959

原创 深度探索C++对象模型-第一章

关于对象一 C++封装成本C++用类去定义对象时,系统会为每一个对象分配存储空间。每个对象所占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括函数代码所占用的存储空间。 C++程序的内存格局通常分为四个区:全局数据区(data area),代码区(code area),栈区(stack area),堆区(heap area)(即...

2018-05-21 16:05:03 212

原创 Effetive C++读书笔记-第8、9章

8 定制new和delete & 9 杂项讨论49 了解new-handler的行为1 当operator new抛出异常以反映一个未获得满足的内存需求之前,它会先调用一个客户指定的错误处理函数,一个new-handler函数。为了指定new-handler函数,需要调用std::set_new_handler(),其参数是无法分配足够内存时该被调用的函数,返回值是即将被替...

2018-05-18 14:27:49 146

原创 Effetive C++读书笔记-第7章

7 模版与泛型编程41 了解隐式接口和编译期多态面向对象编程主要通过显式接口和运行期多态解决问题。显式接口:源代码中可见,在头文件中看到的类的接口。运行期多态:成员函数是virtual,传入类的引用或指针时,在运行时,会自动匹配接口,可能是基类的接口, 也可能是派生类的。模版和泛型编程主要通过隐式接口和编译期多态解决问题。隐式接口:typename T,函数中,会有类型...

2018-05-15 19:47:36 161

原创 Effetive C++读书笔记-第6章

6 继承和面向对象设计32 确定你的public继承塑膜出is-a关系public继承意味着“is-a”,适用于基类身上的每一件事情也一定适用于派生类,因为每一个派生类对象也是一个基类的对象。33 避免遮掩继承而来的名称1 派生类内的名称会遮掩基类内的名称,基类里面重载的所有同名称函数(包括纯虚函数,虚函数,普通成员函数)会被派生类中重写的函数所掩盖,在派生类中无法访问基类...

2018-05-11 16:17:06 129

原创 Effetive C++读书笔记-第5章

5 实现26 尽可能延后变量定义时的出现时间变量应在使用的时候进行构造,并且通过default构造函数构造出一个对象然后对它赋值,比直接在构造时指定初值效率差。27 尽量少做转型动作1 四种C++式转型const_cast:通常被用来将对象的常量性去除。dynamic_cast:主要用来执行安全向下转型(基类到派生类),也就是用来决定某对象是否归属于继承体系中的某个...

2018-05-09 14:23:01 248

原创 Effetive C++读书笔记-第4章

4 设计与声明18 让接口容易被正确使用,不易被误用理想上,如果用户企图使用一个接口而却没有获得预期的行为,代码就应该不通过编译,例如一个接口要求输入一个月份,此时输入小于1和大于12的数都是无效的,我们应该尽量使用不兼容这些数的接口,即输入小于1或者大于12的数就无法通过编译。可选的一个方法是使用enum,但是enum不具备类型安全性,也就是说可以被转换成其他的类型使用(如int)。...

2018-05-07 14:45:28 171

转载 C++ 智能指针

1 autp_ptr(C++11之前)功能简单,源代码简单,所以直接分析源代码(有部分格式改动)可以知道这是一个模版类(声明方法为auto_ptr<T>):首先是类需要用到的一些东西template<class _Ty> //前向声明class auto_ptr;template<class _Ty>struct auto_ptr_ref...

2018-05-06 18:18:04 117

转载 C++ 左值和右值

左值,右值在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。举个例子,int a = b+c, a就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变...

2018-05-05 19:12:44 1487

原创 Effetive C++读书笔记-第3章

3资源管理系统常见的资源除了内存还包括文件描述符,互斥锁,数据库连接,网络socket等。13 以对象管理资源1 使用原始指针(如工厂函数返回构建的堆上资源的指针)容易因为忘记delete造成内存泄漏,解决的方法是获得资源后将其放入管理对象内,管理对象在超出其生存期后,会自动调用析构函数,只要在析构函数中执行内存的释放,就可以通过析构函数自动执行资源释放。这些管理对象被称为RAII...

2018-05-04 13:56:04 134

原创 Effetive C++读书笔记-第1、2章

1 熟悉C++ & 2 构造/析构/赋值运算2 尽量以const,enum,inline替换#define1 对于常量声明,尽量用const代替#define2 #define不具有封装性,所以在类内部用static const来代替。(声明时就要赋初值)3 也可以用枚举代替static const,因为枚举没有地址的概念,空间分配在常量区,所以无法对其取地址(C++中...

2018-05-03 16:27:49 220

转载 为什么const对象只能调用const成员函数,而不能调用非const成员函数?

在c++中,我们可以用const来定义一个const对象,const对象是不可以调用类中的非const成员函数,这是为什么呢?下面是我总结的一些原理。假设有一个类,名字为test代码如下:class test{  int i;public:  void print();  test(int i);};我们知道c++在类的成员函数中还会隐式传入一个指向当前对象的this指针,所...

2018-05-02 15:03:26 930

原创 关于git和github的一些总结

git的相关命令通过git init命令把当前目录变成Git可以管理的仓库:git init添加文件到git仓库# 1用命令git add告诉Git,把文件添加到仓库:git add XXX# 用命令git commit告诉Git,把文件提交到仓库git commit -m "some words about change"为什么Git添加文件需要add,comm...

2018-04-17 01:01:46 191

原创 搬运的一些动态规划题目(C++实现)

1、连续子数组的最大和来源:剑指offer面试题31 题目,输入一个整形术组,数组里有整数也有负数,数组中一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n)例子:int arr[] = {1,-2,3,10,-4,7,2,-5}; 在遍历整个数组的过程中,我们可以发现数组中每一个数字为子数组尾部(假设长度为m),对应的子数组和,都是和前面m-...

2018-04-17 01:00:57 2543

转载 C++ 引用声明为const

const引用只读不可修改,与绑定对象是否为const无关。 非const引用可读可改,只可与非const对象对象绑定。const intival = 1024;//int &ref2 = ival; //error:nonconst reference to a const objectconst int&refval = ival; //ok:both refer...

2018-04-09 22:56:55 903

原创 STL 迭代器

迭代器偏特化的意义偏特化偏特化就是对部分模板参数指定特定的类型。 如一个萃取迭代器所指类型的类:template<typename T> //输入的T是迭代器类型,其内部实现了value_type类型struct iterator_traits{ typedef typename T::value_type value_type; //typenam...

2018-03-26 15:25:24 101

原创 STL 空间配置器

内存的申请和释放STL的内存分配和释放被详细区分为四个部分:内存配置由allocate()负责(内部实现为operator new),内存释放由deallocate()负责(内部实现为operator delete);对象构造由construct()负责(内部实现为placement new),对象析构操作由destroy()负责(内部实现为~T()【T为对应类型】)operator ne...

2018-03-26 09:27:32 183

原创 Linux 多进程多线程编程

一 创建进程1 进程号进程号的类型是pid_t(typedef unsigned int pid_t)。获得进程和父进程ID的API如下:#include <sys/types.h>#include <unistd.h>pid_t getpid();//获得进程IDpid_t getppid();//获得父进程ID2 进程复制进程复制可以...

2018-03-20 21:50:05 3696

空空如也

空空如也

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

TA关注的人

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