专注linux服务端编程
减小动态库大小

ELF文件类型: ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。可以说,ELF是构成众多xNIX系统的基 …

在使用map的operator[]和find(),遇到一个问题,发现不知怎么的,本来已经删除的项,在find()时,居然已经不等于end()了。 查看map的[]方法说明才发现: mapped_type& operator[] (const key_type& k); mapped_type& operator[] (key_type …

区别 kqueue和epoll是freebsd和linux下用于大规模网络io复用的方法。它们之前和很多相似之处。但也有些地方要注意: select/poll/epoll还不支持普通文件,而kqueue支持; kqueue可以多次add,它通过<fd, filter>的组合作为不同过滤器之间的标志,如果这两个键完全相同,则直接覆盖; epoll以 …

网络通信中的close时注意事项

socket关闭时的一个简单的流程: read函数当接收到一个FIN时,会返回0,所以可以通过它来判断另一端是否已经关闭了。 当A方调用close时,另一方B read会返回0,如果B没有调用close,则B会到CLOSE_WAIT,而A停在了FIN_TIME2. 所以在写程序的时候,要注意,一次关闭操作,两端都会有close的调用。 另外要注意如果是主动关 …

stl中算法分成两类,一类是与stl中特定的数据结构相关的,另一类是通用的;与特定数据结构相关的在容器里有讲到,比如二叉树、红黑树相关的算法。下面讲的是通用的算法。算法一般的前两个参数都要指定一个区间范围[fist, last),并且也会有一个参数用来传递一个仿函数,用于算法内部,比如sort,要用到相等比较,但是一个自定义的类型,可能没有定义equal方法 …

stl源码笔记__关联容器_hashtable

hashtable hashtable,hash_set,hash_map在c++4.9.1的源码中都存在两份,一份是最新默认使用的,另一份在backward的文件夹中。而backward文件夹中的代码更接近是《stl源码剖析》中提到的那样。不过下面,还是以最新的代码来看看它的结构。最新的hashtable异常复杂。 通过c++11中的unordered_m …

set 上篇文章说到了RB_tree,这里就是对tree的运用和适配。 set的特点是它的元素都会被自动排序,并且它没有key和value的区分,所以key和value都为同一个对象,还有set不能有相同的值。 由于key和value是同个对象,所以我们不能很简单的改变对象,否则会影响到底层树的排序。所以有源码中set<T>::iterator被 …

stl源码笔记__关联容器_红黑树

二叉查找树 二叉查找树中任何一个结点,它的左子树中的任何结点都小于它,而右子树中的任何结点都大于它。由于插入操作都是找到一个叶子结点进行插入,所以很容易就造成树失去平衡,而在二叉查找树中,当search,min,max,insert,delete等操作都是o(h),h表示数的高度,所以我们希望树的高度越小越好。 为了保证二叉树的性质,同时又能改变它的布局,二 …

priority_queue的表现和queue完全不同,它从头取到的数据是所有元素中的最大值。 实现这种优先级队列的方法 为了实现优先级算法,至少要能得到最大值,所以我们首先想到的是对元素进行排序,所以根据不同的算法,有以下几种选择: 快速排序: 取出数据之前,先调用一次sort,然后删除最大值;这样插入数据很简单,但是取数据时每次都要进行一次排序,而最快的 …

stack stack是一个先进后出的的结构,所以的元素只能通过顶部得到,它没有提供遍历所以元素的方法,所以它不用iterator。 根据stack的性质,它要提供empty,size,top,push_back, pop_back,这些操作list和deque都支持,所以完全没有必要再自己重新实现一次,它默认是通过封装deque来实现的。 template …