C++
xiaowenmu1
这个作者很懒,什么都没留下…
展开
-
c++ lambda原理猜想及验证
猜想:让我们先看看lambda表达式的形式:[capture list] (parameter list) ->return type{function body}。可以看到lambda的第一部分为捕获列表,第二部分为参数列表,第三部分为返回值类型,第四部分为函数体。就是这样一个表达式,那么c++是怎么处理它的呢。猜想c++会构建一个类,然后capture list中的参数作为类中的成...原创 2019-06-26 22:42:22 · 167 阅读 · 0 评论 -
C++移动语义和完美转发
移动语义和完美转发都是通过C++的右值引用来实现的。关于什么是右值引用可以去看看C++ primer这本书。1、移动语义首先,很多人会想,为什么我们有了拷贝赋值以后为什么还要有移动语义呢。我们先来看一个例子,假设我们有个类A和类B(两个类都是class test类型,见下图),假如我们想把类A赋值给类B(类A中有通过new分配的内存空间),传统的赋值拷贝是要再申请一块内存空间给B,然后...原创 2019-06-12 22:19:11 · 737 阅读 · 0 评论 -
为什么多线程读写 shared_ptr 要加锁?
为什么多线程读写 shared_ptr 要加锁?陈硕(giantchen_AT_gmail_DOT_com)2012-01-28最新版下载:http://chenshuo.googlecode.com/files/CppEngineering.pdf我在《Linu...转载 2019-05-28 23:54:00 · 194 阅读 · 0 评论 -
对C++构造函数与析构函数以及成员的构造和析构顺序理解
1.对象构造过程中执行的顺序(1)先构造基类的成员(2)执行基类的构造函数(在执行构造函数里我们写的代码之前基类的成员已经创建好了)(3)构造派生类的成员(4)执行派生类的构造函数由输出结果可知,先构建基类b的成员也就是c,再执行基类b的构造函数。然后再构造派生类a的成员d,然后再执行a的构造函数。2.对象析构过程中的执行顺序(1)先执行派生类的析构...原创 2019-04-25 21:00:52 · 1115 阅读 · 0 评论 -
缓冲的设计
本人实现了一个buffer,该buffer相当于一个环形缓冲区,添加数据时内部数据不需要挪动位置。该缓冲并没有实现缓冲的收缩功能以及对字节大小端的转换,如果需要稍微改进下就可以了。有兴趣的可以在GitHub上下载:https://github.com/xiaowenmu/buffer...原创 2019-05-17 16:14:12 · 323 阅读 · 0 评论 -
epoll_wait返回事件的测试
由epoll返回的事件可以有EPOLLIN,EPOLLOUT,EPOLLRDHUP,EPOLLPRI,EPOLLERR,EPOLLHUP。关于EPOLLIN,EPOLLOUT,EPOLLPRI相信大家都熟悉,EPOLLIN代表有数据可读,EPOLLOUT代表可写,EPOLLPRI代表有带外数据可读。接下来让我们关注一下EPOLLRDHUP,EPOLLERR,EPOLLHUP事件...原创 2019-05-22 11:18:15 · 3747 阅读 · 0 评论 -
对sleep(0)和sched_yield一点理解
在了解sleep(0)和sched_yield之前先让我们看看linux是怎么调度的(这里只讲CFS)1.CFSCFS不会根据优先级分配一个不变的运行时间,比如说分配5ms这样的,它是一个分配占用处理器比例的一个分配算法。CFS的做法是允许每个进程运行一段时间,循环轮转,选择运行最少的进程(通过vruntime来判断,下面可以看到vruntime是怎么计算的)作为下一个运行进程,而不再采用...原创 2019-05-25 23:35:47 · 1180 阅读 · 0 评论 -
C++中volatile变量测试
volatile有好几个特性,让我们来验证一下1.对声明为volatile的变量操作时,每次都会从内存中取值,而不会使用原先保存在寄存器中的值。 让我们看一下两个例子,一个例子是对不声明为volatile的变量操作,一个例子是对声明为volatile的变量操作。编译器为gcc version 4.8.4,平台为32位ubuntu14.04,开启了一级优化,即g++ -O1 ...原创 2019-05-25 19:08:07 · 319 阅读 · 0 评论 -
二叉树的前序,中序,后序遍历的非递归实现
下面所有的测试都是基于这颗树来的,如果有什么边界条件没注意到,麻烦告诉我一下,谢谢!1.中序遍历讲一下边界条件:除了判断save是否为空外为什么还要加一个判断temp是否为空,因为当你遍历完左子树然后遍历根节点时save已经为空了,但是还有右子树需要遍历。2.前序遍历3.后序遍历...原创 2019-05-21 18:55:11 · 217 阅读 · 0 评论 -
static_cast,const_cast,reinterpret_cast,dynamic_cast
1.static_cast 在c++primer中提到,任何具有明确定义的类型转换,只要不包含底层const(关于什么是底层const什么是顶层const可以去c++primer看一下),都可以使用static_cast,如把double类型的对象转换成int类型的对象。但是书中没有提到的是,把一个类转换成另一个类(两个类之间没有关系)的时候编译器会报错。看下面代码。...原创 2019-05-21 12:15:07 · 215 阅读 · 0 评论 -
epoll在多线程下的使用
首先让我们思考一个问题,当一个进程正在阻塞在epoll_wait的时候,另一个线程调用epoll_ctl时会发生什么呢,这个动作安全吗?测试当epoll_wait期间另一个线程执行epoll_ctl是否安全其实这种动作是安全的(测试平台为linux,内核为4.4版本),先看一下man里面的描述,可见是安全的。1.下面让我们来测试一下,首先把fd2加入监听,然后再调用epoll_wa...原创 2019-05-11 14:10:46 · 8953 阅读 · 0 评论 -
vector内存分配浅析
STL中vector的内存分配原则是分配为2倍的,为什么是2倍呢,让我们来分析一下。其实分配内存就是在时间和空间上做一个平衡,如果每次增加的内存很少,那么在空间上浪费的就要少一点,但是时间耗费的要多。如果每次增加的内存很多,那么重新分配的次数就要少一点,时间耗费的也要少一点,但是浪费的空间就要多一点。可能有的人对空间浪费的说法不太清除,我在这里简单说明一下。假设每次增加内存时都以常数c增加,那...原创 2019-05-10 14:16:39 · 2896 阅读 · 0 评论 -
线程池的简单实现
本文讲述的是实现一个简单的线程池,用户只需要把任务放进线程池里面,然后线程池会自己取任务然后去执行。下面是代码。任务是由队列管理的,以保证任务按先入先执行的规则。在队列中添加任务和删除任务之间要实现互斥访问队列,所以先实现一个互斥锁类。其中RETCHECK是我们还要实现一个条件变量,后面可以用上它,只是做一些简单的封装下面是线程的实现下面是线程池...原创 2019-05-09 20:09:25 · 114 阅读 · 0 评论 -
C++中虚函数能不能声明为private
如果声明虚函数声明为private时编译会报错,但是还是有手段调用声明为private的虚函数的。首先让我们来看看调用声明为private的虚函数时会发生什么情况。#include <iostream>using namespace std;class classB{private: virtual void fun() { cout << "virtua...原创 2019-07-13 22:11:12 · 2555 阅读 · 1 评论