自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 汉诺塔问题

A B C 三根 ,把A上的圆盘移到C上的圆盘move(A,B,C,n)if(n==1){A-->C;return ;}move(A,C,B,n-1);A--->C;move(B,A,C,n-1)

2017-12-13 14:39:03 201

转载 如何用10只实验鼠检测出1000个药瓶中哪个有毒药?

转自:http://blog.csdn.net/u012027907/article/details/1229647当我第一次看到这个面试题的时候,也不知道从何处下手,但在别人的提示下,我才明白了!    如果你看到这个题目,能够立即想到2 的 10 次方 = 1024.那你已经知道答案了!   原题的描述是:给你10只实验小鼠,用7天的时间检验1000个瓶子中带有一瓶

2017-12-13 14:32:46 449

原创 memmove的实现

代码实现的关键在于内存区域是否有重合,但是实际研究不管是不是有重合,都会有以下情况void * memmove(void * dst ,void* src,size_t n){if(dst==nullptr||src==nullptr)return nullptr;        char* pdst=char*(dst);char* psrc=char*(src);

2017-12-13 14:29:31 290

原创 线段树解析以及代码模板

线段树的概念线段树是一种二叉搜索树,线段树的每个节点存了一个区间,所以得名。线段树如果是非叶子节点一定有两个子节点,如果有左子树那么就一定有右子树。主要应用是区间最大值以及区间最小值以及区间求和,区间更新。线段树的数据域一般存储区间的和,以及区间的最大值,最小值等等。线段树的操作以区间求值为例子struct Node{ int begin,end;

2017-11-07 20:52:57 208

原创 深入理解Nginx:模块开发与架构解析 读书笔记

Nginx的作用当我们在设计高性能web服务器的时候,我们第一选择是使用Nginx,因为nginx对服务器性能上的挖掘已经到了非常高的水平,Nginx采用了无阻塞分阶段的事件驱动框架。当nginx不能那个完全实现我们的业务需求的时候,我们可以在Nginx后端搭建一个非nginx服务器,利用前段的Nginx服务器来做负载均衡,但是这时候我们又会遇到,在设计后端服务器的非阻塞时间架构的问题。(解决

2017-11-01 10:56:37 871

原创 leetcode 算法复习题目

这是第一遍没有成功解答好的题目 随时更新(从最新的submission可以找到最优的解答)204. Count Primes

2017-10-18 21:58:05 277

转载 Linux的时间函数总结

linux时间函数总结linux里有特别多的时间函数,主要分为获取当前时间的函数以及定时函数。获取当前时间:gettimeofday 优点:精度达到微妙,在用户态实现,没有上下文切换以及陷入内核的开销(在x86-64平台上)。其他函数的一些问题:time函数精确到秒不够精确 ftime已经被废弃 clock_gettime精度达到纳秒 但是是系统调用 开销较大。注意:用一个In

2017-10-17 16:18:16 184

转载 C++单例模式的实现。

C++单例模式的实现template Singleton{public: static T& getinstance() { pthread_once(&ponce_,&Singleton::init); return *value; }private: singleton(); Singleton(const Singleton); ~Singleton();

2017-09-23 15:42:39 164

原创 Linux多线程服务器编程shared_ptr以及weak_ptr实现的弱回调以及对象池管理

shared_ptr以及weak_ptr实现的弱回调以及对象池管理直接上代码一条一条的解释class StockFactory:public boost::enable_shared_from_this,boost::noncopyable{public: shared_ptr get(const string& key) { shared_ptr pStock;//从工厂中产

2017-09-23 12:06:34 629

原创 解析enable_shared_from_this

enable_shared_from_this解析,作用,原理直接以代码来说明:class Connection{public: void func() { //我们的Connection对象都被shared_ptr所管理,在这个函数中我们需要获得对象的shared_ptr. //但是我们不能够这么写 //shared_ptr local_sp(this),这个创建当前

2017-09-23 11:52:55 211

原创 在同一个程序中结合C++

在同一个程序中结合C++和C在同一个程序中结合C++以及c我们需要注意的4大主题:1.name mangling (名称重整)2.statics(静态对象初始化)3.动态内存分配4.数据结构的兼容性。对于名称重整我们知道在C++中由于重载的存在我们需要对函数的名称进行重整,但是c的函数我们就不需要重整。那么当我们在我们的C++程序中引入一个c的头文件,里面含有一些函数,

2017-09-20 11:04:56 297

原创 more effective C++在未来时态下发展程序

在未来时态下发展程序所谓的未来时态就是接受事物总会改变的事实,并准备应对之道。我们应该以C++本身来表现各种规范而不是简单的以注释和说明文档的形式:如果我们的类不想被继承那么我们就可以把构造函数以及复制构造函数声明为private(这样的函数不能够被构造),然后再类中声明我们自己的伪构造函数。如果一个class必须生成在heap内,在不被继承的情况下我们可能考虑把对象的析构函数声明为p

2017-09-20 10:33:49 276

原创 more effective C++设计模式 要求(或禁止)对象产生于heap中

要求(或)禁止对象产生于heap中有时候我们想让某种对象具有自杀的能力,所以我们必须要求对象存在堆中,以便我们调用delete this.有的时候堆空间非常宝贵,并且我们需要保证不发生内存泄露所以我们要对象全为栈对象,必须禁止对象产生于堆中。要求对象产生于堆中一种典型的手法是把析构函数声明为protected,然后给类一个伪构造函数destroy来调用delete this.下面我们来

2017-09-18 14:35:54 380

原创 more effective C++设计模式限制对象产生

限制对象的产生个数限制对象产生的个数是我们在程序设计中经常遇到的问题,有的时候我们的系统只有一台打印机,所以我们只能存在一个打印机对象。我们的文件描述符有限,所以我们也要限制文件描述符产生的数量。单例模式设计以一个打印机对象的设计为例子:class PrintJob;class Printer{public: friend Printer& thePrinter();pr

2017-09-17 14:47:54 167

原创 more effective 一些设计模式解析一

将构造函数和非成员函数虚化遇到这个主题的时候,我们必须明白构造函数并没有实际的是虚函数,只是表现出了虚函数的行为而已,就是根据输入中的真实东西(而不是表面上的一些东西)执行相应的行为。将构造函数虚化将构造函数虚化主要分为两个部分,就是虚构造函数以及虚复制构造函数。虚构造函数的主要用途在于从磁盘或网络构建对象的时候,我们来看下面的例子(用于处理新闻的类,其内容主要由文字以及图像构成,

2017-09-17 11:00:41 158

原创 more effective C++效率解析

与C++语言密切相关的效率问题了解临时对象的来源临时对象意味着对象的构造以及析构,我们必须了解临时对象的产生,以规避一些效率问题,临时对象主要的两个产生方式:1.隐式类型转换被施行以求函数调用成功。2 函数返回对象的时候。对于第一种情况:以下代码解释:size_t countChar(const string& str,char ch);char buffer[100

2017-09-16 15:11:37 211

原创 more effective C++ 效率解析

提升程序的效率作为c++程序员,要提升程序的效率,那么主要是从两个方面来考量:1.与程序语言无关的一些法则。2.与C++密切相关的一些效率法则。(不要产生和销毁过多的对象)。与程序语言无关的一些法则:1.牢记80-20法则,一个程序80%的资源用于20%的代码上,我们必须有针对性的改进这个20%的代码才能提升我们代码的效率。具体针对哪部分进行优化,并不是靠猜测的,而是使

2017-09-15 14:38:43 216

原创 more effective C++条款十二解析

了解抛出一个异常的方方面面首先我们必须清楚,一个异常对象被抛出的时候一定是发生了对象的复制行为的,所以抛出异常可能是比较慢的操作。因为第一次抛出对象一定会发生复制行为,所以说抛出的一定是对象的静态类型(相对于动态类型来说的),但是在第二层处理函数抛出异常的时候,我们可以简单的使用throw;来避免对象的复制行为。相对于抛出异常一定发生对象的复制行为,利用catch接收异常的时候我们却需要用by

2017-09-13 20:01:45 180

原创 more effective C++条款十解析

在处理异常的时候 利用对象来管理资源来避免资源泄露我们的程序可能在某一条语句抛出异常,导致其之后的代码没有被执行。这时候我们利用对象来管理资源,避免泄露,你可能会说利用try  catch的形式,但是形式使我们的程序的复用性降低,并且可读性降低。利用对象来管理资源,如果抛出异常来的话,当程序离开其作用域析构函数就会被调用。避免资源泄露。在构造函数内阻止资源泄露构造函数尚未完成,C++不

2017-09-13 18:58:55 283

原创 more effective C++条款八解读

了解不同意义的new和delete这里所说的new是new operator,operator new 以及placement new。首先我们明确new操作符需要完成两个工作,一个是调用operator new分配一定的内存空间,调用对象的构造函数。如果我们我们打算自己给对象分配内存,那么我们定义自己的operator new,在调用new操作符,那么new操作符会调用我们的operat

2017-09-07 16:17:56 228

原创 more effective C++条款六解析

区分前置increment与后置increment区分前置与后置++,首先明确他们的操作符重载带来的写法上的不同:class UPInt{public: UPint& operator++() {*this+=1;return *this} const UPInt operator++(int) { UPInt oldValue=*this;++(*this);return old

2017-09-07 15:51:52 232

原创 more effective C++条款五解析

尽量不要提供类型转换函数类型转换函数主要包括单自变量的构造函数以及显示定义的operator type(),这两个函数都可以隐式的对象类型进行转换,但是隐式类型转换经常是我们不能控制的。对于显示定义的operator type(),我们尽量不要使用这种隐式的转化,而是显示的转换,例子就是标准库的string类并没有提供到char*的隐式转换,而是提供了一个c_str()函数。所以最好显示的

2017-09-07 15:32:45 182

原创 C++对象模型解析五

对象成员的效率1.对对象成员的封装本身不会带来效率的损失(如果打开优化开关)2.继承不会影响效率。3.虚拟继承的虚基类的存取会带来一定的效率损失,尽管可以通过一个非多态的对象(不需要执行器期的间接存取)进行的,但是编译器还是对对象进行了间接存取操作。间接性抑制了把所有计算都移向寄存器的优化能力。指向数据成员的指针取累的数据成员的地址得到的是器偏移值

2017-09-07 14:36:47 126

原创 C++对象模型解析四

对象的数据成员相关以及存取效率一个对象的大小一个对象的大小主要由以下因素决定:1.对象自身的数据成员。2.若对象没有成员变量,编译器会给器安插1Byte的空间,以使两个具体对象的地址不同。3.编译器对空的虚基类的特殊处理(不继承被安插的1Bytes)4.虚函数以及虚基类的指针5.编译器边界调整(32位机器中,对象大小调整到4的倍数)以一个例子解释class X{

2017-09-07 09:44:19 176

原创 more effective C++条款四解读

深刻考虑是否需要给类提供一个默认构造函数有一些类拥有一个默认构造函数是合理的需求,比如string比如容器 linked list vector 默认构造函数可以把他们初始化为空容器。但是有一些类我们最好还是不要提供默认构造函数。比如一个equipment类class equipment{private: int IDNumber;}对于这个equipment类,我们提供一个默认

2017-09-06 15:53:28 233

原创 more effective C++条款二解析

少用转型操作,如果非要使用转型操作请使用C++新式的转型操作转型操作首先并非是完全没有效率上损失的(多重继承派生类到子类的转换),所以首先我们需要尽量少用转型操作,如果我们非要使用转型操作也要使用新型的C++风格的转型操作static_cast const_cast  dynamic_cast  reinterpret_cast.(主要原因是C风格的转型操作并不区分各种类型的转型操作,同时转型

2017-09-06 15:15:16 191

原创 more effective C++条款一解析

仔细区别指针和引用指针和引用的最大区别在于:没有所谓的NULL reference存在,并且reference总是指向他当初获得的那个对象,不能改变。所以当我们考虑不指向任何对象或者指向的对象可能改变的时候需要使用指针。当我们指向的对象不会改变时使用引用(使用引用时不用测试器有效性)同时我们明白引用一般不单独使用,主要使用在函数参数以及返回值上。比如一个常用的运算符重载就使用引用ope

2017-09-06 14:59:16 315

原创 C++对象模型解析三

复制构造函数的操作像default constructor一样 如果一个class没有声明一个复制构造函数,就会有隐式的声明出现。跟之前一样,C++标准会把复制构造函数分为有用的以及无用的,只有有用的实例才会被合成到程序之中,决定一个copy constructor是否是trivial的标准在于class是展现出所谓的bitwise copy semantics。bitwise copy

2017-09-06 09:28:50 142

原创 C++对象模型解析二

编译器对于对象构造过程的干涉,以及对于程序形式和程序效率的冲击对于一个class X,如果没有任何user-declared constructor,那么会有一个默认的constructor被隐式的声明出来....一个被隐式声明出来的构造函数是一个trivial constructor(无用的constructor)。编译器会合成non-trivival constructor 的4中情况

2017-09-05 16:25:38 125

原创 C++对象模型解析一

关于对象

2017-09-04 17:05:38 154

转载 Linux内核进程

1.1 Linux进程管理进程管理是操作系统的最重要的功能之一。有效率的进程管理能保证一个程序平稳而高效地运行。Linux的进程管理与UNIX的进程管理相似。它包括进程调度、中断处理、信号、进程优先级、上下文切换、进程状态、进度内存等。1.1.1 什么是进程?一个进程是处于执行期的程序(目标码存放在某种介质上)。但是不局限于一段可执行的代码,通常进程还包括其他资源,比如打开的文件,

2017-09-04 14:47:12 313

原创 effective C++条款四十七解读

请使用traits classes表现类型信息。traits classes使得类型相关信息在编译期可用。他们以template以及templates 特化完成实现。整合重载技术后,traits classes有可能在编译期对类型执行If..else...测试.以标准库中的迭代器为例:首先根据迭代器的类型为迭代器提供卷标分类。struct input_iterator_tag{

2017-08-29 15:37:24 277

原创 effective C++条款四十六解读

需要类型转换时,请为模板定义class 内部的friend函数还是以一个例子作为开头:template class Rational{public:Rational(const T& numerator=0,const T&numerator=1 );}templateconst Rational operator*(const Ration

2017-08-29 15:10:15 255

原创 C++中模板定义与声明为什么放在同一个文件中

首先明确的是:对普通函数来说,声明放在头文件中,定义放在源文件中,其它的地方要使用该函数时,仅需要包含头文件即可,因为编译器编译时是以一个源文件作为单元编译的,当它遇到不在本文件中定义的函数时,若能够找到其声明,则会将此符号放在本编译单元的外部符号表中,链接的时候自然就可以找到该符号的定义了。对于模板。先明确,模板函数是在编译器遇到使用模板的代码时才将模板函数实例化(之前只有函数的模板定义

2017-08-29 14:26:23 942

原创 effective C++条款四十五解读

运用成员函数模板接收所有参数类型这里我们主要以智能指针模板为例来讲解,原始指针之间存在这样派生类像基类的转换,也就是一种隐式转换关系:类似下面这种情况:class Base {}class Derived: public Base{}Base *pB=new Derived;我们也希望智能指针支持类似这样的操作,以使其支持运行期多态。那么可以通过成员函数模板来解决这个问题:

2017-08-29 14:16:03 326

原创 effective C++条款四十四解读

将于模板参数无关的代码抽离整个templates使用模板我们必须有一个概念,利用模板我们不需要为多个类编写不同的处理代码,class template的成员函数只有在被使用时才被暗中具现化,所以只要这300个函数都被使用,就会获得300个函数代码。整个条款其实在说注意模板可能带来的代码膨胀(二进制代码带着重复的代码 数据)。在编写函数的时候,我们会把两个函数相同的部分进行抽离形成一个单独的

2017-08-29 11:16:55 218

原创 effective C++条款四十三解读

学习处理模板化基类内的名称直接以一段代码来解释class companyA{public: void sendMsgA(); void sendMsgB(); ...};class companyB{public: void sendMsgA(); void sendMsgB();}class companyC{public: void sendMsgB()

2017-08-29 10:16:47 264

原创 effective C++条款四十二解读

了解typename的双重意义1.template 与template 没有区别。typename 的另一种用法,我们以一个代码来解释:templatevoid print2nd(const C&container){ if(container.size()>2) { C::const_iterator iter(container.begin()); ++iter;

2017-08-29 09:51:20 191

原创 effective C++条款四十一解读

了解隐式接口和编译期多态面向对象的编程世界总是以显示接口以及运行期多态解决问题。class Widget {public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); void swap(Widget& other); }void doPro

2017-08-29 09:19:04 281

原创 C++对象模型中数据成员与继承

继承与数据成员的关系这里我们讨论继承与数据成员的关系主要涉及这几个方面:1.单一继承同时又不含virtual fucntions2.单一继承并含虚函数3.多重继承4.虚拟继承单一继承同时又不含virtual function的情况:1.这里注意主要这一张单一继承的关系无法表现出多态,也就是多不能通过基类的对象来同时处理基类以及派生类的对象。2.这里可能会造成代码膨胀

2017-08-27 17:47:19 178

空空如也

空空如也

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

TA关注的人

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