自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

鱼思故渊的专栏

不积跬步,无以至千里;不积小流,无以成江海

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

原创 C++基础知识--static成员和const成员函数

我们可以用static修饰一个类的成员函数,也可以用const修饰类的成员函数(写在函数的最后表示不能修改成员变量,不是指写在前面表示返回值为常量)。能不能同时用static和const修饰类的称冠函数?不能。C++编译器在实现const成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this

2014-12-31 11:25:04 1780

原创 TCP/IP详解--TCP首部选项字段的作用

1、TCP首部选项字段多达40B,记下一些常用的东西:2、选项结束字段(EOP,0x00),占1B,一个报文段仅用一次。放在末尾用于填充,用途是说明:首部已经没有更多的消息,应用数据在下一个32位字开始处3、无操作字段(NOP, 0x01),占1B,也用于填充,放在选项的开头4、MSS(最大报文段长度),格式如下:种类(1B,值为2),长度(1B,值为4),数值(2B)

2014-12-30 12:22:57 4880

转载 孤儿进程与僵尸进程

1、前言  之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧。晚上回来google了一下,再次参考APUE,认真总结一下,加深理解。2、基本概念  我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的

2014-12-28 16:58:21 788

转载 C语言中宏的高级用法

1、前言    今天看代码时候,遇到一些宏,之前没有见过,感觉挺新鲜。如是上网google一下,顺便总结一下,方便以后学习和运用。C语言程序中广泛的使用宏定义,采用关键字define进行定义,宏只是一种简单的字符串替换,根据是否带参数分为无参和带参。宏的简单应用很容易掌握,今天主要总结一下宏的特殊符号及惯用法。  (1)宏中包含特殊符号:#、##.      (2)宏定义用do{ }w

2014-12-28 13:50:43 974

原创 C语言结构体声明中冒号的使用(占位符) & C结构体的乱序初始化

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域

2014-12-28 10:58:38 7049 1

原创 C语言中变长数组的使用方法

先说说我的理解:struct example{    __u16 tag_type;    __u16 tag_len;    char tag_data[0];} __attribute ((packed));1. 存在的意义:当结构体的长度变长时,例如里面有一个字符串时,为了方便管理内存。这个结构体不要用struct example a的方式定义, 而应用str

2014-12-28 10:10:47 16649 1

原创 深入探索C++对象象模型--拷贝构造函数、对象模型

拷贝构造函数如果没有定义拷贝构造函数,那么编译器会自动生成一个拷贝构造函数,但是这个拷贝构造函数是有一定限度的。一般来说这个拷贝构造函数是按照位直接拷贝的,但是在有些情况下这种初始化是有问题的,在特殊的四种情况下是有问题的,在有问题的情况下,可以举例说明。如果一个有多态性质的对象,子类赋值给父类,调用了拷贝构造函数,这个时候就需要给父类的虚拟函数表重新分配,使得虚拟函数表和子类不是同一

2014-12-27 19:37:49 1199

原创 深入探索C++对象模型--指针类型 & 多态机制

指针的类型不同类型的指针,从内存需求的观点来说,没有什么不同!他们三个都需要足够的内存来繁殖一个机器地址,“指向不同类型之各指针”之间的差异,既不在其指针表示法不同,也不再其内容(代表一个地址)不同,而是在其所寻址出来的对象类型不同。也就是说,“指针类型”会导致编译器如何解释某个特定地址中的内存内容及其大小1、  一个指向地址1000的整数地址,在32位机器上,将涵盖地址空间1000~10

2014-12-27 12:23:37 1397

原创 STL源码分析--空间配置器的底层实现 (二)

STL源码分析—空间配置器空间配置器中门道在STL中的容器里都是使用统一的空间配置器,空间配置器就是管理分配内存和销毁内存的。在STL将在heap空间创建一个对象分为两个步骤,第一是申请一块内存,第二是在这块内存中初始化一个对象。首先申请空间是由malloc提供,初始化一个对象时由constructor管理。销毁一个对象也是由两步骤完成,第一是销毁空间上的对象,第二是释放这块内存。同时

2014-12-26 14:50:49 924

原创 STL源码分析--仿函数 & 模板的模板参数 & 临时对象

STL源码分析—使用的一些特殊语法关于泛型编程中用到的一些特殊语法,这些语法也适用于平常的模板编程1、  类模板中使用静态成员变量Static成员变量在类模板中并不是很特殊,同时这个变量不属于对象,属于实例化以后的这个类类型。每一个实例化对应一个static变量2、  类模板中可以再有模板成员3、  模板参数可以根据前一个模板参数而设定默认值4、  类模板可以拥有非类型的模

2014-12-26 11:48:13 1232

原创 Effective STL--不同容器删除特定元素的方法

输入迭代器是每个迭代位置智能被读一次的只读迭代器。输出迭代器是每个迭代位置只能被写一次的只写迭代器。输入和输出迭代器被塑造为读和写输入和输出流。前向迭代器有输入和输出迭代器的能力,但是他们可以反复读或写一个位置。它们不支持operator--,所以他们可以高效地向前移动任意次数。所有的标准STL容器都支持比前向迭代器更强大的迭代器。散列容器是前向迭代器,单链表容器也提供前向迭代器 双向迭代

2014-12-25 10:45:30 997

原创 智能指针的实现--使用引用计数实现以及原理

一、智能指针  在C++语言编程时,当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。      智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该

2014-12-24 22:36:21 2148

原创 Effective c++--智能指针 & 函数模板

Shared_ptr允许当智能指针被建立起来是指定一个资源释放函数绑定于智能指针身上,也就是说在shared_ptr被初始化的同时也可以指定其管理的资源的释放函数。Shared_ptr提供的某个构造函数接受两个实参:一个是被管理的指针,另一个是引用次数变为0时将被调用的“删除器”。Shared_ptr构造函数坚持其第一个参数必须是个指针。它支持定制型删除器。 缺省情况下C++以by val

2014-12-24 21:22:49 1111

原创 C++基础知识---static const成员变量的初始化

为了将常量的作用域限制于class内,你必须让让成为class的一个成员;而为确保此常量之多只有一份实体,你必须让让成为一个static成员:Class Gameplayer{         Private:                   Staticconst int Number = 5;  //常量声明式                   Intscores[N

2014-12-23 22:41:41 1783

原创 泛型编程与STL--各类容器迭代器失效的场景

各类容器迭代器失效的场景:其实在定义迭代器失效的时:在某些操作完成以后,认为这个迭代器指向的值有变化或者迭代器直接指向不合法的空间,都认为迭代器失效。只要不是指向操作之前的值都认为迭代器失效。当要将元素安插于vector内,大小与容量之间的差别就变得格外重要。如果vector的大小等于其容量,安插新元素的唯一方法就是增加这个vector的内存总量,这意味得分配一块新的而且更大的内存,再将旧

2014-12-22 14:52:46 1424

原创 C++基础知识--赋值操作符重载

赋值运算符重载:赋值运算符重载需要考虑什么问题:Class mystring{         Public:                   Mystring(char*pdata = NULL);                   Mystring(constmystring& str);                   ~mystring(void);

2014-12-19 19:26:24 805

原创 C++基础知识—关于默认构造函数的一切

C++条款—关于默认构造函数的一切 默认构造函数(defaultconstructor):默认构造函数是在未提供显示初始值时,用来创建对象的构造函数。如果没有提供任何构造函数,则C++将自动提供默认构造函数,默认构造函数没有参数,因为声明中不包含值。同时,当且仅当没有定义构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,程序员就必须为它提供默认构造函数,如果提供了非默认构造

2014-12-19 19:24:30 1910

原创 C++基础知识---构造函数 & 析构函数 & 虚拟析构函数

问题:          类需要一个无参的构造函数么?         类需要一个析构函数么?         类的构造函数需要初始化所有的对象成员么? 类需要一个虚析构函数么?有些类需要虚析构函数只是为了声明他们的析构函数是虚的。绝不会用作基类的类是不需要虚析构函数的:任何虚函数只在继承的情况下才有用。假设B为父类,D为子类,B何时需要一个虚析构函数?只有有人肯呢过会对实际指

2014-12-19 19:22:51 961

原创 Linux内核结构体--kfifo 环状缓冲区

1、前言  最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的。缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度。例如一个进程A产生数据发给另外一个进程B,进程B需要对进程A传的数据进行处理并写入文件,如果B没有处理完,则A要延迟发送。为了保证进程A减少等待时间,可以在A和B之间采用一个缓冲区,A每次将数据存放在缓冲区中,

2014-12-17 19:46:37 8413 5

原创 深入探索C++对象模型--C++构造函数

C++构造函数语意对象构造过程中编译器的干预原则和方法。Default constructor的构建方法经常会提到default constructor,那么什么时候才会合成出一个default consgtructor呢?当编译器需要它的时候。别合成出来的constructor值执行编译器所需的行动。         如果一个class没有任何constructor,但它内含一个

2014-12-16 19:57:45 811

原创 深入探索C++对象模型--对象模型

C++对象模型C++中数据成员有两种:static和nonstatic,以及三种classmember functions:static nonstatic和virtual现在标准C++对象模型:Nonstatic data Members被置于每一个classobject之内,static data members则被存放在所有的class object之外,static和nonst

2014-12-16 12:41:32 987

原创 Effective C++--经验条款

高效C++ --模板与泛型编程在C++中模板体现的是编译器多态,virtual体现的是运行期多态。关于typename的双重含义:在声明template参数时,不论使用关键字class或typename,意义完全相同。但是C++并不总是把class和typename视为邓建。有时候必须使用typename。Template内出血的名称如果依于某个template参数,称之为从属

2014-12-15 22:03:13 812

原创 Effective C++ --经验条款

高效C++ -4必须返回对象时,别妄想返回其reference:这句话什么意思呢?就是在一个函数内,如果你需要这个函数返回一个新的对象,那么这个函数的返回值类型就不要定义成引用类型。就直接返回这个类类型。首先,我们知道在函数传递参数时,传递引用的好处,尤其是对那么比较大的类型,但是对于内建类型和STL的迭代器类型就没有必要使用引用传递,就可以使用值传递。因为对于内建类型传递引用不值得。

2014-12-15 21:59:20 712

原创 高效C++ --经验条款(三)

高效C++ --经验条款(三)给多态基类声明virtual析构函数:“给base classes一个virtual析构函数”,这个规则只适用于带有多态性质的base classes身上。这种base classes的设计目的是为了用来“通过base class接口处理derived class对象”。并非所有base classes的设计目的都是为了多态用途。例如标准stirng和ST

2014-12-14 22:06:23 800

原创 高效C++ --经验条款(二)

STL迭代器以指针为根据塑造,所以迭代器的作用就像个T*指针,声明迭代器为const就像声明指针为const一样(既声明一个T* const指针),表示这个迭代器不得执行不同的东西,但它所指的东西的值是可以改动的。如果你希望迭代器所指的东西不可被改变(类似const T*指针),需要的是const_iterator。Std::vector  vec;Const std::vector::i

2014-12-14 22:04:56 981

原创 高效C++ --经验条款(一)

Effective C++指针和引用的不同:指针在定义的时候就必须进行初始化,如果在使用的过程中,这个变量可能指向为空,那么就不要使用引用,就需要使用指针。指针域引用的另一个重要的不同是指针可以被重新定义赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,如果改变了应用的值,那么引用指向的对象就被修改了。在以下情况下你应该使用指针,一是你考虑到存在不

2014-12-14 08:23:04 949

原创 STL源码分析--仿函数 & 配接器

STL源码分析—仿函数 & 配接器仿函数就是函数对象。就实现观点而言,仿函数其实就是一个“行为类似函数”的对象。为了能够“行为类似函数”,其类别定义中必须自定义(或说改写。重载)function call 运算子(operator()),拥有这样的运算子后,我们就可以在仿函数的对象后面加上一对小括号,以此调用仿函数所定义的operator()。仿函数作为可配接的关键因素。       

2014-12-13 18:49:04 1216

原创 高效STL--非标准散列容器

STL是建立在泛化之上的。数组泛化为容器,参数化了所包含的对象的类型。函数泛化为算法,参数化了所用的迭代器的类型。指针泛化为迭代器,参数化了所指向的对象的类型。STL中的六大组件:容器、算法、迭代器、配置器、适配器、仿函数。这六大组件中在容器中分为序列式容器和关联容器两类,正好作为STL源码剖析这本书的内容。迭代器是容器和算法之间的胶合剂,从实现的角度来看,迭代器是一种将operator*、o

2014-12-13 18:48:10 1042

原创 STL源码分析--算法

STL源码剖析—算法         在STL中的算法中一些算法是可以根据算法名字来判断算法作用的。所有算法的参数都是迭代器,不过不同的算法调用的迭代器类型也是不同的。多有的STL算法都作用在由迭代器{first,lase)所表示出来的区间上。拷贝(copy)交换(swap)替换(replace)填写(fill)删除(remove)排列组合(permutation)分割(partition)随

2014-12-13 18:44:28 876

原创 STL源码剖析---关联容器

STL源码剖析---关联容器         标准关联容器分为set和map两大类,包括multiset和multimap,这些容器的底层机制都是RB-tree.标准之外的关联容器有hashtable 以及以此hash table为底层机制而完成的hash_set(散列集合) hash_map(散列映射表) hash_multiset  hash_multimap.序列和关联容器各自的内部

2014-12-09 22:02:01 1011

原创 STL源码剖析—序列容器

STL源码剖析—序列容器对于STL中的容器,存在一定的内含关系,例如,heap内含一个vector,priority-queue内含一个hep,stack和queue都含有一个deque,set/map/multiset/multimap都内含一个RB-tree,hash_x都内含一个hashtable。         对于序列容器来说,vector和list的插入都是在指向迭代器之前进

2014-12-08 22:31:57 1262

原创 STL源码剖析—迭代器与traits编程方法

STL源码剖析—迭代器与traits编程方法         STL的中心思想就是将算法和容器分开,彼此独立设计,最后再以粘合在一起,算法和容器的泛型化,并不是很难,C++的class templates和function templates可以达成目标,但是粘合在一起就是迭代器的事情。         这么一说迭代器就是为了粘合算法和容器的,如果单独设计迭代器,那么这个迭代器就必须知道某

2014-12-08 19:53:39 1092

原创 STL源码剖析 --- 空间配置器 std::alloc

STL是建立在泛化之上的。数组泛化为容器,参数化了所包含的对象的类型。函数泛化为算法,参数化了所用的迭代器的类型。指针泛化为迭代器,参数化了所指向的对象的类型。STL中的六大组件:容器、算法、迭代器、配置器、适配器、仿函数。这六大组件中在容器中分为序列式容器和关联容器两类,正好作为STL源码剖析这本书的内容。迭代器是容器和算法之间的胶合剂,从实现的角度来看,迭代器是一种将operator*、o

2014-12-07 23:24:38 2518

原创 高效STL—迭代器 & 算法

高效STL—迭代器 & 算法         每个标准STL容器提供了四种不容的迭代器:iterator、const_iterator、reverse_iterator和const_reverse_iterator。同时容器的insert和erase的某些形式只接受其中一种。没有办法从const的迭代器转换为非const的迭代器,不能隐式转换也不能通过const_case转换。但是可以使用

2014-12-06 21:11:56 1092

原创 Effective STL--交换技巧来修改过剩容量

通过“交换技巧”来修正过剩容量         假设一个向量在使用的过程中被扩大了容量,但是在以后的过程中向量中的元素又被删除,虽说向量中的元素被删除但是向量的容量没有变小,也就是说原来申请的内存空间没有得到释放,加入在某一个时刻向量的容量为10000,最后向量中的元素个数可能是10,那么过剩的空间就是浪费,这个时候可以通过交换算法来修改向量的大小。#include #include

2014-12-06 19:47:58 1105

原创 Effective STL --关联容器

高效STL—关联容器         标准关联容器中最重要的就是基于等价而不是相等。比如对于基本的函数库有find函数,但是对于set关联容器也是有find成员函数的。因为标准关联容器保持有序,所以每一个容器必须有一个定义了怎么保持东西有序的比较函数(默认是less)。等价是根据这个比较函数定义的,所以标准关联容器的用户只需要为他们要使用的任意容器指定一个比较函数           

2014-12-06 19:44:21 929

原创 Effective STL 建议

Vector是一种可以默认使用的序列类型,当很频繁地对序列中部进行插入和删除时应该用lit,当大部分插入和删除发生在序列的头或尾时可以选择deque这种数据结构。         STL是建立在泛化上的。数组泛化了容器,参数化了所包含的对象的类型。函数泛化为算法,参数化了所有的迭代器的类型。指针泛化为迭代器,参数化了所指向的对象的类型。         独立的容器类型泛化为序列或关联容器,

2014-12-06 08:55:21 1845

原创 C++中算术运算的隐式转换规则

1、隐式转换    C在以下四种情况下会进行隐式转换:       1、算术运算式中,低类型能够转换为高类型。       2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。       3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。       4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。

2014-12-01 10:12:53 6001

nginx源码分析--带注释

nginx源码分析,分析过程中将重要的部分进行了注释,以便理解

2014-11-26

libevent-1.4.12-stable-注释版

注释了libevent中很关键的部分,很重要的接口函数。

2014-03-07

空空如也

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

TA关注的人

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