<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[青春兵荒马乱的专栏]]></title><description><![CDATA[hold on and keep fighting ! ]]></description><link>https://blog.youkuaiyun.com/xiaomoniao</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; xiaomoniao]]></copyright><item><title><![CDATA[彻底了解指针数组，数组指针，以及函数指针，以及堆中的分配规则]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/25464253</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/25464253</guid><author>xiaomoniao</author><pubDate>Sat, 10 May 2014 10:45:23 +0800</pubDate><description><![CDATA[一 ：关于指针和堆的内存分配

先来介绍一下指针: 指针一种类型，理论上来说它包含其他变量的地址，因此有的书上也叫它：地址变量。既然指针是一个类型，是类型就有大小，在达内的服务器上或者普通的PC机上，都是４个字节大小,里边只是存储了一个变量的地址而已。不管什么类型的指针，char * ,int * ,int (*) ,string * ,float * ，都是说明了本指针所指向的地址空间是什么]]></description><category></category></item><item><title><![CDATA[TCP协议中的三次握手和四次挥手(图解)]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/23216865</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/23216865</guid><author>xiaomoniao</author><pubDate>Tue, 08 Apr 2014 22:56:08 +0800</pubDate><description><![CDATA[建立TCP需要三次握手才能建立，而断开连接则需要四次握手。整个过程如下图所示：



先来看看如何建立连接的。




首先Client端发送连接请求报文，Server段接受连接后回复ACK报文，并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文，并分配资源，这样TCP连接就建立了。

那如何断开连接呢？简单的过程如下：




]]></description><category></category></item><item><title><![CDATA[C++中智能指针的设计和使用]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/21780501</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/21780501</guid><author>xiaomoniao</author><pubDate>Sat, 22 Mar 2014 10:11:06 +0800</pubDate><description><![CDATA[转载请标明出处，原文地址：http://blog.youkuaiyun.com/hackbuteer1/article/details/7561235
     智能指针(smart pointer)是存储指向动态分配（堆）对象指针的类，用于生存期控制，能够确保自动正确的销毁动态分配的对象，防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对]]></description><category></category></item><item><title><![CDATA[Linux网络编程入门]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/21737973</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/21737973</guid><author>xiaomoniao</author><pubDate>Fri, 21 Mar 2014 18:32:16 +0800</pubDate><description><![CDATA[(一)Linux网络编程--网络知识介绍
Linux网络编程--网络知识介绍
客户端和服务端 
        网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 

客户端
        在网络程序中，如果一个程序主动和外面的程序通信，那么我们把这个程序称为客户端程序。 比如我们使用ftp程序从另外一
        个地方获取文件的时候，是我]]></description><category></category></item><item><title><![CDATA[已知中序后序创建二叉树]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/21553647</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/21553647</guid><author>xiaomoniao</author><pubDate>Wed, 19 Mar 2014 20:20:48 +0800</pubDate><description><![CDATA[#include
#include
#include
#include

template
class BinaryTree
{
public:
	struct TreeNode
	{
		Type data;
		TreeNode *leftchild, *rightchild;
	};
	BinaryTree() {}
	~BinaryTree(){}
private:
	TreeNode *]]></description><category></category></item><item><title><![CDATA[C/C++位运算技巧]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/21553529</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/21553529</guid><author>xiaomoniao</author><pubDate>Wed, 19 Mar 2014 20:18:48 +0800</pubDate><description><![CDATA[预备知识

对于位运算，大家都很熟悉，基本的位操作有与、或、非、异或等等。在面试中经常会出现位运算相关的题，所以我就做了简单的整理，参考了很多写的很好的博客及书籍。

现在简单说一下，移位运算。

左移运算：x 

右移运算：x >> y。将x右移y位，这需要区分x是有符号数还是无符号数。在x是无符号数时，只需将x的最右边的y位丢弃，在左边补上y个0。在x是有符号数时，又分为x是正]]></description><category></category></item><item><title><![CDATA[C++ 对象的内存布局（下）]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/20654459</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/20654459</guid><author>xiaomoniao</author><pubDate>Thu, 06 Mar 2014 21:28:56 +0800</pubDate><description><![CDATA[C++ 对象的内存布局(下)
 
陈皓
http://blog.youkuaiyun.com/haoel
 
 
重复继承
 
下面我们再来看看，发生重复继承的情况。所谓重复继承，也就是某个基类被间接地重复继承了多次。
 
下图是一个继承图，我们重载了父类的f()函数。
 

 
其类继承的源代码如下所示。其中，每个类都有两个变量，一个是整形（4字节），一个是字符（1字节），而且还]]></description><category></category></item><item><title><![CDATA[C++ 对象的内存布局(上)]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/20653433</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/20653433</guid><author>xiaomoniao</author><pubDate>Thu, 06 Mar 2014 21:15:36 +0800</pubDate><description><![CDATA[陈皓
http://blog.youkuaiyun.com/haoel
 
 
前言
 
07年12月，我写了一篇《C++虚函数表解析》的文章，引起了大家的兴趣。有很多朋友对我的文章留了言，有鼓励我的，有批评我的，还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为，在上一篇文章中，我用了的示例都是非常简单的，主要是为了说明一些机理上的问题，也是为了图一些表达]]></description><category></category></item><item><title><![CDATA[C++ 虚函数表解析]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/20652969</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/20652969</guid><author>xiaomoniao</author><pubDate>Thu, 06 Mar 2014 21:09:43 +0800</pubDate><description><![CDATA[陈皓
http://blog.youkuaiyun.com/haoel
 
 
前言
 
C++中的虚函数的作用主要是实现了多态的机制。关于多态，简而言之就是用父类型别的指针指向其子类的实例，然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”，这是一种泛型技术。所谓泛型技术，说白了就是试图使用不变的代码来实现可变的算法。比如：模板技术，RTTI技术，虚函数技术，要么是]]></description><category></category></item><item><title><![CDATA[关于char, wchar_t, TCHAR, _T(),L,宏 _T、TEXT,_TEXT、L]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/20311801</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/20311801</guid><author>xiaomoniao</author><pubDate>Sun, 02 Mar 2014 21:59:23 +0800</pubDate><description><![CDATA[char :单字节变量类型，最多表示256个字符，

wchar_t :宽字节变量类型，用于表示Unicode字符，

它实际定义在里：typedef unsigned short wchar_t。

为了让编译器识别Unicode字符串，必须以在前面加一个“L”,定义宽字节类型方法如下：

    wchar_t c = `A' ; 
wchar_t * p = L"Hello]]></description><category></category></item><item><title><![CDATA[一个fork的面试题]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/17362879</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/17362879</guid><author>xiaomoniao</author><pubDate>Mon, 16 Dec 2013 22:53:28 +0800</pubDate><description><![CDATA[前两天有人问了个关于Unix的fork()系统调用的面试题，这个题正好是我大约十年前找工作时某公司问我的一个题，我觉得比较有趣，写篇文章与大家分享一下。这个题是这样的：

题目：请问下面的程序一共输出多少个“-”？







1

2

3

4

5

6

7

8

9

10

11

12

13

14]]></description><category></category></item><item><title><![CDATA[C++类对象内存模型与成员函数调用分析（下）]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306095</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306095</guid><author>xiaomoniao</author><pubDate>Fri, 13 Dec 2013 18:01:31 +0800</pubDate><description><![CDATA[2.4.2 多重继承下的虚拟函数

多重继承下的虚拟函数主要有一下几个麻烦：
1.         几个父类都声明了相同原型的virtual函数；
2.         有不止一个父类将其析构函数声明为虚拟；
3.         一般的虚拟函数问题；
先给出代码段9。
class Parent1{
public:
   Parent1() : data_parent1(0.0)]]></description><category></category></item><item><title><![CDATA[C++类对象内存模型与成员函数调用分析（中）]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306091</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306091</guid><author>xiaomoniao</author><pubDate>Fri, 13 Dec 2013 18:01:03 +0800</pubDate><description><![CDATA[2.4 虚拟成员函数





这





是本文中最复杂也最有趣的话题了。虚拟函数也是和继承这个话题相伴相生，所以本节将纳入对单继承、多重继承和虚拟继承，一起描述他们之间的关系，这样，对C++对虚拟函数的调用，以及由此所变现出来的多态的理解，应该是非常清晰了。
2.4.1 单继承下的虚拟成员函数
对于虚拟函数，我们首先引入两个数据结构，为什么引入一会就知道了。
1]]></description><category></category></item><item><title><![CDATA[C++类对象内存模型与成员函数调用分析（上）]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306081</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306081</guid><author>xiaomoniao</author><pubDate>Fri, 13 Dec 2013 18:00:28 +0800</pubDate><description><![CDATA[C++类对象内存模型是一个比较抓狂的问题，主要是C++特性太多了，所以必须建立一个清晰的分析层次。一般而言，讲到C++对象，都比较容易反应到以下这个图表：
 

 
这篇文章，就以这个表格作为分析和行文的策略的纵向指导；横向上，兼以考虑无继承、单继承、多重继承及虚拟继承四方面情况，这样一来，思维层次应该算是比较清晰了。
1、C++类数据成员的内存模型
1.1 无继承情况
实验最能说明]]></description><category></category></item><item><title><![CDATA[C/C++堆栈指引]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306051</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306051</guid><author>xiaomoniao</author><pubDate>Fri, 13 Dec 2013 17:58:15 +0800</pubDate><description><![CDATA[言

    我们经常会讨论这样的问题：什么时候数据存储在堆栈(Stack)中，什么时候数据存储在堆(Heap)中。我们知道，局部变量是存储在堆栈中的；debug时，查看堆栈可以知道函数的调用顺序；函数调用时传递参数，事实上是把参数压入堆栈，听起来，堆栈象一个大杂烩。那么，堆栈(Stack)到底是如何工作的呢？ 本文将详解C/C++堆栈的工作机制。阅读时请注意以下几点：

    1）本文]]></description><category></category></item><item><title><![CDATA[C++对象的内存分析（6）]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306035</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306035</guid><author>xiaomoniao</author><pubDate>Fri, 13 Dec 2013 17:57:02 +0800</pubDate><description><![CDATA[前言

    本节讨论构造函数，析构函数和虚析构函数。可能很多人都有这样的经历，面试时经常被问到：什么情况下要使用虚析构函数，为什么要使用虚析构函数？本文将试图对编译器的实现机制进行分析，来回答这个问题。

 构造函数和析构函数的调用链

    我们从例子来分析，首先我们来看下面这个继承链：



    代码如下：








class CBasi]]></description><category></category></item><item><title><![CDATA[C++对象的内存分析（5）]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306025</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306025</guid><author>xiaomoniao</author><pubDate>Fri, 13 Dec 2013 17:56:16 +0800</pubDate><description><![CDATA[前言

    前面4节我们已经完成了对4种C++对象布局的分析，本文试图覆盖更多的，常见的C++面向对象的概念。所以，最后2节将继续阐述2个主题：接口和抽象类以及构造函数、虚构函数和虚析构函数。

 接口

    这里我准备只主要阐述接口，而不谈一般的抽象类。因为在C++中，是没有“接口”这种类型的，所有的接口事实上是定义为纯抽象类。所谓纯抽象类，就是没有成员变量，没有实现了的函数]]></description><category></category></item><item><title><![CDATA[C++对象的内存分析（4）]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306019</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306019</guid><author>xiaomoniao</author><pubDate>Fri, 13 Dec 2013 17:55:35 +0800</pubDate><description><![CDATA[前言

    本章节是4个课题的最后一个，我们将讨论多重继承情况下，对象内存的布局。阅读本文，请思考下面的问题：当子类从多个基类继承，虚函数指针和成员变量将如何布局？编译器如何进行子类和基类之间类型转换？如果多个基类具有同样的虚函数，子类选择哪个实现来调用？如果子类重写该虚函数，那么它覆盖的是哪个基类的实现呢？

 多重继承

    我们将分析这样的例子：CFinal类继承自CBa]]></description><category></category></item><item><title><![CDATA[C++对象的内存分析（3）]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306001</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/17306001</guid><author>xiaomoniao</author><pubDate>Fri, 13 Dec 2013 17:54:50 +0800</pubDate><description><![CDATA[前言
    在第二节我们讲到从带虚函数的基类继承的子类，有一个虚函数指针在对象的最前端。但是，如果基类没有虚函数而子类有呢？阅读本节请思考下面的问题：没有虚函数的基类，会有虚函数指针和虚函数表吗？从该类继承的子类，内存中的元素如何布局。

 Subject3：从不带虚函数的基类继承的子类
    我们把上一节的CBasic类的2个虚函数删除，CFinal从CBasic类继承并增加新的虚函]]></description><category></category></item><item><title><![CDATA[C++对象的内存分析（2）]]></title><link>https://blog.youkuaiyun.com/xiaomoniao/article/details/17305987</link><guid>https://blog.youkuaiyun.com/xiaomoniao/article/details/17305987</guid><author>xiaomoniao</author><pubDate>Fri, 13 Dec 2013 17:53:57 +0800</pubDate><description><![CDATA[前言

    本章节讨论单继承情况下类对象的内存特性。阅读时请思考这几个问题:从子类到基类的类型转换，编译器做了什么？多态是怎么实现的？类的成员函数（包括虚函数）和普通函数有什么区别吗？

Subject2：从带虚函数的基类继承的子类

    类CFinal是我们要分析的目标，它从CBasic中继承而来，重写（override）了虚函数add；增加了一个新的虚函数；增加了一个成员变]]></description><category></category></item></channel></rss>