7now_的博客

代码即人生

XRDP使用

很久没写博客了,最近公司测试使用到了远程桌面,花了一点时间研究了一下,记录一下心得。 XRDP介绍 Xrdp是一个开源工具,允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP之外,xrdp工具还接受来自其他RDP客户端的连接,如FreeRDP,rdesktop和...

2019-05-18 22:18:39

阅读数 27

评论数 0

非递归快排

非递归快排 通过使用栈来模拟函数栈的调用,每次将首尾指针存入到栈中,并对首尾之间区域进行快排。 #include <iostream> #include <stack> #include &am...

2018-07-27 00:02:30

阅读数 77

评论数 0

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

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

2018-07-26 19:49:54

阅读数 4951

评论数 2

第八章 微调

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

2018-07-19 13:41:05

阅读数 48

评论数 0

第七章 并发API

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

2018-07-18 16:36:46

阅读数 126

评论数 0

第六章 lambda表达式

lambda表达式是表达式的一种,它是源代码的组成部分。 std::find_if(container.begin(), contianer.end(), [](int val){ return 0 < val; }); 闭包是lambda表达式创建的运行期对象,...

2018-07-15 21:48:48

阅读数 226

评论数 0

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

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

2018-07-12 15:07:29

阅读数 180

评论数 0

dpdk无锁队列

这篇博客是从网上博客整理摘抄而来,具体参考的博客内容在文末给出。 Linux无锁队列 kfifo概述 Linux内核中有一个先进先出的数据结构,采用环形队列的数据结构来实现,提供一个无边界的字节流服务。最重要的是,这个队列采用的是无锁的方式来实现。即当它用于只有一个入队线程和一个出队线程...

2018-07-09 17:45:51

阅读数 907

评论数 0

dpdk存储系统

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

2018-07-09 17:44:00

阅读数 131

评论数 0

第四章 智能指针

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

2018-07-09 15:36:09

阅读数 107

评论数 0

dpdk线程亲和性

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

2018-07-04 21:13:51

阅读数 742

评论数 0

第三章 转向现代C++

七 在创建对象时注意区分()和{} C++11中多了一种初始化的方式,就是通过{}来进行初始化,例如初始化一个int类型 int x(0); int y = 0; int z{0}; int z = {0}; 使用大括号初始化容器非常方便: vector&l...

2018-07-04 19:06:07

阅读数 161

评论数 0

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

背包问题 0-1背包 这是最简单的背包问题,简而言之就是每件物品只有一样,可以取或者不取,对于容量为V的背包,N件物品,每一件都可以尝试放入背包中,那么顺序就是遍历这N件物品,每遍历到一个新的物品,都尝试将当前物品放入背包中,看看是放入后得到的价值高还是不放的价值高,取最高者即可。 所以...

2018-07-04 14:34:52

阅读数 166

评论数 0

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

题目: 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码。 这里涉及到的问题是主线程和子线程之间的切换,也就是说子线程跑一下,然后阻塞,主线程再跑一下,然后在阻塞,如此各循环 50次,注...

2018-06-15 12:40:14

阅读数 1108

评论数 1

第二章 auto

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

2018-06-10 19:04:28

阅读数 87

评论数 0

第一章 型别推导

第一章 型别推导 一 理解模板型别推导 函数模板类型如下: template <typename T> void f(ParamType param); //ParamType是一个T相关的类型 f(expr...

2018-06-10 18:36:32

阅读数 128

评论数 0

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

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

2018-06-10 18:34:52

阅读数 163

评论数 0

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

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

2018-06-04 16:37:58

阅读数 953

评论数 0

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

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

2018-05-31 19:22:07

阅读数 59

评论数 0

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

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

2018-05-29 18:36:45

阅读数 67

评论数 0

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