Articles

  • Effective C++

    介绍

    从网络上整理的Effective C++ 读书笔记,鉴于其中有些部分内容太老,因为参考1的文章成语2006年,而最近有新出 C++11,其中有些内容需要更新,以反映语言的新变化。另外其中有些内容基于我自己的理解做了适当的更改,包括但不限于删除,添加和修改。

  • Linux select

    Introduction

    本篇为 Linux I/O 事件通知机制系列第一篇,介绍 select。 其他两篇为:

  • 函数式编程

    转自 coolshell,原文链接

    当我们说起函数式编程来说,我们会看到如下函数式编程的长相:

    • 函数式编程的三大特性:
      • immutable data 不可变数据:像Clojure一样,默认上变量是不可变的,如果你要改变变量,你需要把变量copy出去修改。这样一来,可以让你的程序少很多Bug。因为,程序中的状态不好维护,在并发的时候更不好维护。(你可以试想一下如果你的程序有个复杂的状态,当以后别人改你代码的时候,是很容易出bug的,在并行中这样的问题就更多了)
      • first class functions:这个技术可以让你的函数就像变量一样来使用。也就是说,你的函数可以像变量一样被创建,修改,并当成变量一样传递,返回或是在函数中嵌套函数。这个有点像Javascript的Prototype(参看Javascript的面向对象编程
      • 尾递归优化:我们知道递归的害处,那就是如果递归很深的话,stack受不了,并会导致性能大幅度下降。所以,我们使用尾递归优化技术——每次递归时都会重用stack,这样一来能够提升性能,当然,这需要语言或编译器的支持。Python就不支持。

     

  • Standard Template Library: Algorithms

    The header defines a collection of functions especially designed to be used on ranges of elements.

    A range is any sequence of objects that can be accessed through iterators or pointers, such as an array or an instance of some of the STL containers. Notice though, that algorithms operate through iterators directly on the values, not affecting in any way the structure of any possible container (it never affects the size or storage allocation of the container).

  • Linux epoll

    Introduction

    本篇为 Linux I/O 事件通知机制系列第三篇,介绍 epool。 其他两篇为:

  • public、protected和private继承

    Introduction

    Differences among public, protected and private.

  • C++ 对象的自杀

    前两天看到一个问题,一个类的成员函数是否可以delete this 
    据出题者的意思来看,是认为这样的问题一般比较少人会遇到,而这样就可以了解一下对方对未知问题的分析和解决思路。

    出于这点,我也想看看自己的思路,所以就先自己思考了一下。
    1. 要使用delete,那么对象需要使用new来实例化(处于堆中),而不能使用类似DemoCls d;这样的语句将对象放在栈中;
    2. 成员函数delete this,这样给了我一种感觉:这个成员函数是不是超出了自己的权限呢?然而进一步想,我认为delete this纯粹代表释放this指针指向的特定大小的内存空间,告诉内存管理单元这块内存区域又“自由”了;
    基于以上两点,我认为由new运算符分配空间得到的对象的成员函数可以调用delete this;语句。

  • Linux/Unix 多线程通信

    线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用。 不过要注意的是线程间需要做好同步,一般用 mutex。 可以参考一些比较新的 UNIX/Linux 编程的书,都会提到 Posix 线程编程,比如《UNIX环境高级编程(第二版)》、《UNIX系统编程》等等。 Linux 的消息属于 IPC,也就是进程间通信,线程用不上。

    • 使用多线程的理由之一是和进程相比,它是一种非常”节俭”的多任务操作方式。

      我们知道,在 Linux 系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种”昂贵”的多任务工作方式。 而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。

    • 使用多线程的理由之二是线程间方便的通信机制。

      对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。 线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。 当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为 static 的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。

  • Sorting Algorithm

    This article describe some sorting algorithms.

  • Linux/Unix socket 网络编程

    Table of Contents

    基本概念

    OSI参考模型

    七层模型

    其七层模型从下到上分别为:

    1. 物理层(Physical Layer,PH)
    2. 数据链路层(Data Link Layer,DL)
    3. 网络层(Network Layer,N)
    4. 运输层(Transport Layer,T)
    5. 会话层(Session Layer,S)
    6. 表示层(Presentation Layer,P)
    7. 应用层(Application Layer,A)