自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

FreeeLinux's blog

没有迷路的人

  • 博客(88)
  • 资源 (3)
  • 收藏
  • 关注

原创 C++模板之trait与模板技巧

一:trait1.Fixed Traits主要是构造适应各种类型的函数Fixed主要指,一旦定义了这个分离的 trait,则无法在算法中进行改写。value trait 是用于针对型别进行 value 方面的操作,如 zero(),它是 fixed trait 和下面的另外一种参数化萃取的一部分。template class accumulation_traits;t

2016-12-31 20:12:31 2341

原创 《深度探索C++对象模型》读书笔记第七章:站在对象模型的尖端

模板:对于类来说,只有成员函数在被使用的时候,才会被具现出来。之所以如此,主要有两个原因:空间和事件的考虑。可能只使用少数成员函数,不需要具现全部。尚未实现的机能。并不是一个 template 具现出来的所有类型一定能够完整支持一组成员函数所需要的运算符。如果只具现真正用到的成员函数,编译器就能够支持哪些对于其他成员函数可能造成编译错误的类型。(比如T t = 1024,t 或

2016-12-31 13:35:53 476

原创 《深度探索C++对象模型》读书笔记第六章:执行期语意学

C++保证一定会在 main() 函数之前构造出全局对象,在 main() 函数结束之前把全局对象摧毁掉。这是静态的初始化操作和内存释放操作。C++中所有的全局对象都放在程序的 data segment 中。如果明确给它一个值,对象将以该值为初值,否则对象所配置到的内存内容全为 0。包括 POD类型,这个C语言不一样。在C中专门有 .bss 段来存放未初始化的全局变量。cfront

2016-12-31 12:37:08 667

转载 动态内存管理详解:malloc/free/new/delete/brk/mmap

c 内存获取和释放 malloc/free, calloc/realloc上述8个函数/操作符是c/c++语言里常用来做动态内存的申请和释放的,要理解这些接口,大概需要下面几个维度的了解:1. 了解OS的进程空间模型,一个进程的地址空间,一般划分为内核区、用户区,用户区又划分为栈区、堆区、数据区、代码区。这里的‘堆区’,‘栈区’,‘数据区’,‘内核区’,其实就是一个

2016-12-31 11:28:01 521 1

转载 C++ 的 new 关键字深入理解

new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:

2016-12-31 11:02:49 1624

原创 《深度探索C++对象模型》读书笔记第五章:构造、解构、拷贝语意学

纯虚基类尽量不要定义数据成员,如果定义了就需要在构造函数或其他成员函数设定初值,不过这通常是一种不好的设计。纯虚基类的纯虚函数可以在派生类中以静态方式调用。声明了纯虚析构函数就一定得定义它,为什么?因为每一个派生类析构函数都会被编译器扩展,以静态调用方式调用其每一个虚基类以及上一层基类的析构函数。因此,只要缺乏任何一个基类析构函数的定义,就会导致链接失败。如果某个函数其函数定义内容不与类型有关,不

2016-12-31 02:36:48 729

原创 《深度探索C++对象模型》读书笔记第四章:Function语意学

C++中类的非静态成员函数和一般函数具有相同的效率,编译器内部会将成员函数转化为对等的普通函数实体,比如加上 this 指针。一般而言,编译器对函数会用 ”mangling“ 手法进行命名处理,这也是函数重载的支持手段。独立于 class object 之外的存取操作,在某个时候特别重要。比如说 static 成员函数,它的主要特性是没有 this 指针,因此差不多等同于非成员函数,所以它可以成为

2016-12-30 21:44:54 547

原创 《深度探索C++对象模型》读书笔记第三章:Data语意学

这是第三章,第三章当时我的博客: C++对象模型Data语意学分析、虚继承底层实现机制 写的比较详细,所以这次可能总结会少一些。关于 class 的大小分析上面提到的博客有详细分析。对于 origin.x=0.0 和 pt->x=0.0 两种方式存取数据有什么重大差异?答案是:当调用类是一个派生类,而且在其继承体系中有一个虚基类,并且被存取的成员(如本例的x)是一个从该虚基类继

2016-12-30 17:05:55 642

转载 关于NRV优化详细分析

在C++中,函数返回整数或指针是通过eax寄存器进行传递的,理解起来比较简单。    但是返回对象或结构体一直是令人感到困惑的问题。今天我整理了一下,将整个返回过程写下来,以作备用。     还是先通过一个例子来理解这个问题:首先,定义一个类Vector:class Vector{public: int x,y;};然后定义函数add(

2016-12-30 12:11:12 1743

原创 《深度探索C++对象模型》读书笔记第二章:构造函数语意学

第二章主要分析编译器什么情况下为我们合成默认构造函数,我的这篇博客已经写得很详细了: C++编译器默认构造函数合成机制分析,这次只写一些其他要点。编译器在四种情况下会为未声明构造函数的类合成默认(nontrival)构造函数。被合成出来的构造函数只能满足编译(而非程序)的需要,分别是:(1)包含的成员对象有默认构造函数。(2)继承的基类有默认构造函数。(3)该类含有虚函数,需要

2016-12-30 02:15:03 702

转载 C++程序编译过程详解

转自:http://blog.csdn.net/amnotgod/article/details/41808239C++程序编译过程一般来说,我们可以把C++程序编译过程分为以下三步编译预处理主要进行源码级别上的操作,预处理器执行源码中的预处理命令(以‘#’号开头的语句),其中预处理命令可以分为以下几类a. 宏定义命令[ #define

2016-12-30 00:39:37 535

原创 《深度探索C++对象模型》读书笔记第一章:关于对象

有点尴尬,这个笔记已经记过一遍了。重新来过的原因是我读到第五章左右觉得自己对这本书认识不够深刻,暂时就没有记笔记。今天正式把书通读了一遍了,然后现在读第二遍,这一遍我每章都会写一篇博客总结,只总结重点,精要,所以会简短一些。我会以条款的形式来总结。1.从C到C++,使用 class 封装数据一般并不会增加成本。数据成员就像在 C struct之中一样,而成员函数不在 class 内部,

2016-12-29 23:48:42 537

原创 STL之deque源码剖析

暑假那会就开始看 STL 源码了,看了不少,空间配置器,vector,list,map 等等,但是都没有总结,现在感觉忘了不少。最近趁上课没事干,把 STL 源码复习复习,今天就看的所谓的双端队列 deque。一: Deque 概述vector 是我们最常用的容器了,vector 是单向开口的连续线性空间,简单说就是数组。deque 则是一种双向开口的连续线性空间,就是可以

2016-12-29 01:29:28 728

转载 deque容器的实现框架

vector底层采用的是一个数组来实现,list底层采用的是一个环形的双向链表实现,而deque则采用的是两者相结合,所谓结合,并不是两种数据结构的结合,而是某些性能上的结合。我们知道,vector支持随机访问,而list支持常量时间的删除,deque支持的是随机访问以及首尾元素的删除。        deque是double ended queue的缩写,读作deck。首先我们用一个图来说明

2016-12-28 22:42:42 611

原创 96. Unique Binary Search Trees

最近没有刷 leetcode,并不是因为懒,而是最近把在刷《剑指offer》和《程序员代码面试指南》,代码都在牛课网上,以后还可以回顾。并且最近看了一部奇书《深度探索C++对象模型》,这应该是我看过最玄幻的语言类书籍了。目前看了 4 章,感觉大有脾益,顿悟了好多以前关于 C++ 面向对象的设计的思维,以及明白了为什么我以前某某方式编译老不通过的原因。【题目】Given n,

2016-12-27 11:18:01 313

原创 判断一棵二叉树是不是另一棵的子结构问题

【问题】输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)【分析】这个问题其实不难,不过要注意代码上递归的技巧,并不是所有情况都是和我们用一个递归函数来解决的,这道题就用分类递归的思想,很让我受益。【代码如下】class Solution {public: bool HasSubtree(TreeNode*

2016-12-26 11:50:45 1791

原创 十二月状态总结

已经十二月了,转眼间都到学期末了。    最近我也一直熬夜学知识,反正是没有两点前睡过觉,平均大概在两点半左右。但由于临近期末,我都不知道该不该复习。说复习吧,我现在一心想搞技术,根本没有心思去学习课本上所谓的各种变换。说不复习吧,挂科又是悬在我头上的一把尖刀,随时可能掉下来给我一刀,让我再来一年大五。    不过,我的计划是暂时老样子不变,自动控制原理好好复习就行了,其他尽量过。(话说这

2016-12-26 02:17:11 861

原创 C++对象模型Data语意学分析、虚继承底层实现机制

1. Class 的大小一个空 class 的大小为 1 字节,因为编译器需要安插进去一个 char,使得这个 class 对象得以在内存中被配置独一无二的地址。虽然空 class 大小为 1 字节,但是假如某个类 A 继承该空 class,计算类 A 的大小时会优化父类空 class 的大小,如类 A 为空,sizeof(A) = 1,不空,则为类A真实数据大小。我们通常说某个 cl

2016-12-25 22:08:22 936

原创 C++拷贝构造函数、无名临时对象以及NRV优化分析

那么什么时候编译器会为一个 class 生成一个 default copy constructor 呢?和 default constructor 一样,C++ Standard 上说,如果 class 没有声明一个 copy constructor,就会有隐含的声明(implicitly declared)或隐含的定义(implicitly defined)出现,和以前一样,C++ Stan

2016-12-24 04:53:18 1303

原创 C++编译器默认构造函数合成机制分析

我们通常会说当生命一个 class 时,如果我们不为该 class 指定一个 constructor,那么编译器会替我们实现一个 connstructor,那么这种说法一定对吗?事实上,这是不对的。这个不是我说的,是深入理解C++对象模型说的,原话是:      C++新手一般有两个常见的误解:任何 class 如果没有定义 default constructor,就会

2016-12-23 15:59:54 736

原创 muduo库chat server的shared_ptr和TLS实现分析

muduo 库的 chat 最基本的是单线程模型,然后有多线程模型,但是多线程同步需要加锁,锁争用会降低服务器性能,明显的代码就是 chat server 的 onStringMessage()函数:void onStringMessage(const TcpConnectionPtr&, const string& message,

2016-12-23 01:20:11 803 1

原创 muduo库chat server对TCP粘包问题的处理

粘包问题的最本质原因在与接收对等方无法分辨消息与消息之间的边界在哪。我们通过使用某种方案给出边界,例如:发送定长包。如果每个消息的大小都是一样的,那么在接收对等方只要累计接收数据,直到数据等于一个定长的数值就将它作为一个消息。包尾加上\r\n标记。FTP协议正是这么做的。但问题在于如果数据正文中也含有\r\n,则会误判为消息的边界。包头加上包体长度。包头是定长的4个字节,说明了包体的长

2016-12-22 23:56:39 1814

原创 C++对象模型和虚函数表分析以及重载、重写、隐藏的区别

C++在布局以及存取时间上主要的额外负担是由virtual引起的。包括: Virtual function 机制 。用以支持一个有效率的“执行期绑定”(runtime binding)。  Virtual base class。用以实现“多次出现在继承体系中的base class,有一个单一而共享的实体”。 此外,还有一些多重继承下的额外负担。发生在“一个derived class

2016-12-22 20:16:52 1264

原创 Posix信号灯和SystemV信号灯解析

暑假那会把UNPv2大概过了一遍,不过没有总结,除了pipe,所以现在都忘得差不多了,趁最近几天学操作系统,边学边回顾一下。信号灯(semaphore)是一种用于提供不同进程间或一个给定进程的不同线程的同步手段的原语。我所知一共有三种类型信号灯:Posix有名信号灯:使用Posix IPC名字标识,可用于进程或现程间的同步Posix基于内存的信号灯:存放在共享内存区,可

2016-12-21 22:29:24 2265

转载 Linux虚拟地址空间布局以及进程栈和线程栈总结

本文转自多个博客,以及最后有我的总结。我们有单独从头到尾写一个总结的原因是别人已经写得很好了,我不花大量时间是无法达到这水平的。一:Linux虚拟地址空间布局(转自:Linux虚拟地址空间布局) 在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块。在L

2016-12-21 18:55:46 18179 4

转载 理解虚拟内存机制

原文连接:http://blog.csdn.net/iter_zc/article/details/42644229这个系列会总结计算机,网络相关的一些重要的底层原理。很多底层原理大家上学的时候都学过,但是在学校的时候大部分的同学都是为了应付考试而学习,过几天全忘了。随着工作的时间越久,越体会到这些基础知识的重要性。做技术和练武功一样,当你到了一定的阶段,也会遇到一个瓶颈,突破了你的眼

2016-12-21 13:11:08 9882

原创 位运算之不使用任何比较判断比较两个数大小问题

【题目】对于两个32位整数a和b,请设计一个算法返回a和b中较大的。但是不能用任何比较判断。若两数相同,返回任意一个。给定两个整数a和b,请返回较大的数。测试样例:1,2返回:2【分析】不用分析了,直接给代码,我第一次没有仔细读题,实际上用了判断的,解法1作为参考,解法2是正确答案。解法一(结果正确,但是不符合题意):class Compar

2016-12-19 18:00:24 8612 2

原创 最大二叉搜索子树问题

【题目】有一棵二叉树,其中所有节点的值都不一样,找到含有节点最多 的搜索二叉子树,并返回这棵子树的头节点.给定二叉树的头结点root,请返回所求的头结点,若出现多个节点最多的子树,返回头结点权值最大的。【分析】最大二叉搜索子树,我们只需要使用三个变量保存每个结点为根的子树的min,max,以及它对应的最大二叉搜索子树的结点数目。然后判断是否更新即可。注意两点:(左半

2016-12-19 13:39:08 1035

原创 二叉树最远距离问题

【题目】从二叉树的节点A出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点B时,路径上的节点数叫作A到B的距离。对于给定的一棵二叉树,求整棵树上节点间的最大距离。给定一个二叉树的头结点root,请返回最大距离。保证点数大于等于2小于等于500.【分析】二叉树的最远距离有下列几种情况:根的左子树的最远距离+根节点+根的右子树最远距离根的左子树上的最

2016-12-19 11:04:33 1284

原创 折纸问题与二叉树

【题目】请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展 开。此时有1条折痕,突起的⽅向指向纸条的背⾯,这条折痕叫做“下”折痕 ;突起的⽅向指向纸条正⾯的折痕叫做“上”折痕。如果每次都从下边向上⽅ 对折,对折N次。请从上到下计算出所有折痕的⽅向。给定折的次数n,请返回从上到下的折痕的数组,若为下折痕则对应元素为"down",若为上折痕则为"up".测试样例:1

2016-12-19 10:50:38 1282

原创 判断一棵树是否是完全二叉树

【题目】有一棵二叉树,请设计一个算法判断它是否是完全二叉树。给定二叉树的根结点root,请返回一个bool值代表它是否为完全二叉树。树的结点个数小于等于500。【分析】完全二叉树树主要有两点:当一个结点有右孩子,但是没有左孩子,直接返回false当一个节点有左孩子无右孩子,那么接下来要遍历的节点必须是叶子结点。(叶子结点左右孩子为空)使用层次遍历并检查倒数第

2016-12-19 10:29:01 8481 4

转载 线程的概念和模型以及与进程的比较

本博客前面部分转自:http://c.biancheng.net/cpp/html/2593.html线程的基本概念引入进程的目的,是为了使多道程序并发执行,以提高资源利用率和系统吞吐量;而引入线程,则是为了减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。线程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程

2016-12-18 12:56:40 1176

转载 进程的调度算法

在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用。下面介绍几种常用的调度算法。先来先服务(FCFS)调度算法FCFS调度算法是一种最简单的调度算法,该调度算法既可以用于作业调度也可以用于进程调度。在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入

2016-12-18 11:05:11 823

原创 muduo的inspect库以及TCP的Keep-Alive时间分析

一:源码分析    今天剖析muduo inspect库。muduo_inspect库通过HTTP的方式为服务器提供监控接口。比如提供以下功能:接收了多少个TCP连接当前有多少个活动连接一共响应了多少次请求每次请求的平均响应时间为多少ms...    inspect库主要有Inspector类组成,它包含了一个HttpServer对象,并同过ProcessInspector类返

2016-12-17 22:56:51 1066

原创 GDB常用调试命令以及多进程多线程调试

今天把所有的GDB常用的调试命令都过了一遍,尤其是多线程调试。所以先做个总结,以免忘记。以后如果有新的有用的命令会继续追加。一:普通命令1.list命令list  linenum      显示程序第linenum行周围的程序list  function      显示函数名为function的函数的源程序list                      显示当前行后

2016-12-17 11:07:25 9348 2

原创 自旋锁与互斥锁的对比、手工实现自旋锁

本文之前,我只是对自旋锁有所了解,知道它是做什么的,但是没有去测试实现过,甚至以为自旋锁只有kernel用这个,今天才发现POSIX有提供自旋锁的接口。下面我会分析一下自旋锁,并代码实现自旋锁和互斥锁的性能对比,以及利用C++11实现自旋锁。一:自旋锁(spin lock)    自旋锁是一种用于保护多线程共享资源的锁,与一般互斥锁(mutex)不同之处在于当自旋锁尝试获取锁时以忙

2016-12-16 17:31:50 19914 2

原创 完全二叉树统计节点个数【使用二分搜索】

【题目】给定一棵完全二叉树的根节点root,返回这棵树的节点个数。如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法。给定树的根结点root,请返回树的大小。”打眼“一看,这是一道递归求解数的高度的题,于是我不到30秒敲了几行代码就解决:class CountNodes {public: int count(TreeNode* root) {

2016-12-16 02:29:27 4098

原创 muduo的http库剖析

一:http协议    首先看一下http request:request line + header + body (header分为普通报头,请求报头与实体报头)header与body之间有一空行(CRLF)    请求方法有:GET、POST、HEAD、PUT、DELETE等    协议版本:1.0、1.1    详细知识参见这篇博客:http必知必会,

2016-12-14 19:08:44 2503

原创 muduo库的Connector以及TcpClient的使用

一:Connector    Connector可以说是muduo库的连接器,负责客户端向服务器发起连接。实际上说白了就是封装了socket的connect操作。    Connector类的成员如下:class Connector : boost::noncopyable, public boost::enable_shared_from_th

2016-12-14 16:20:28 1845

原创 muduo库TcpConnection对send、shutdown、SIGPIPE的处理

muduo库对send的处理:muduo库的send()函数重载了三个: void send(const void* message, int len); void send(const StringPiece& message); //短字符优化子string类 void send(Buffer* message); // this one will swap data分别

2016-12-14 13:37:20 1831

muduo网络库

如果你用其他的编译不通过,就用这个吧。

2016-12-01

MySQL-python-1.2.5.win64-py2.7.exe

有效解决安装mysql-python时遇到的error: Unable to find vcvarsall.bat问题,以及 %1 win 32 问题

2016-09-20

valgrind-3.10.1

Linux内存泄漏检测工具

2016-08-11

空空如也

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

TA关注的人

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