- 博客(105)
- 资源 (7)
- 收藏
- 关注
原创 boost智能指针之shared_ptr和weak_ptr
std::auto_ptr很多的时候并不能满足我们的要求,比如auto_ptr不能用作STL容器的元素。boost的smart_ptr中提供了4种智能指针和2种智能指针数组来作为std::auto_ptr的补充。 shared_ptr:使用shared_ptr进行对象的生存期自动管理,使得分享资源所有权变得有效且安全.weak_ptr:weak_ptr 是 shared_ptr 的观察员
2015-01-29 09:09:07 5709 1
原创 boost.any实现任意类型存储
当你需要一个可变的类型时,有三种可能的解决方案:无限制的类型,如 void*. 这种方法不可能是类型安全的,应该象逃避灾难一样避免它。可变的类型,即支持多种类型的存储和获取的类型。支持转换的类型,如字符串类型与整数类型之间的转换。Any实现了第二种方案,一个基于值的可变化的类型,无限可能的类型。这个库通常用于把不同类型的东西存储到标准库的容器中。Any 库如何改进你的程序任
2015-01-16 11:23:59 3809 1
原创 C++智能指针之auto_ptr
1. auto_ptrauto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被分给两个拥有者。当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有的动态内存自动释放。即使发生异常,通过异常的栈展开过程也能将动态内存释放。auto_ptr不支持new 数组。2. auto_
2015-01-14 09:33:31 1173 1
原创 RTTI和类型转换
RTTI通过运行时类型识别(RTTI),程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类型。通过下面两个操作符提供 RTTI:1. typeid 操作符,返回指针或引用所指对象的实际类型。2. dynamic_cast 操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。这些操作符只为带有一个或多个虚函数的类返回动态类型信息,对于
2015-01-13 18:06:08 1169
原创 操作符重载之解引用与箭头操作符
箭头操作符与众不同。它可能表现得像二元操作符一样:接受一个对象和一个成员名,对对象解引用以获取成员。不管外表如何,箭头操作符不接受显式形参。这里没有第二个形参,因为 -> 的右操作数不是表达式,相反,是对应着类成员的一个标识符。没有明显可行的途径将一个标识符作为形参传递给函数,相反,由编译器处理获取成员的工作。理解1当这样编写时:point->action();由于优先级规则,它实际等
2015-01-13 18:02:17 2509
转载 自旋锁详解
自旋锁自旋锁(spinlock)是用在多个CPU系统中的锁机制,当一个CPU正访问自旋锁保护的临界区时,临界区将被锁上,其他需要访问此临界区的CPU只能忙等待,直到前面的CPU已访问完临界区,将临界区开锁。自旋锁上锁后让等待线程进行忙等待而不是睡眠阻塞,而信号量是让等待线程睡眠阻塞。自旋锁的忙等待浪费了处理器的时间,但时间通常很短,在1毫秒以下。自旋锁用于多个CPU系统中,在单处理
2014-04-30 18:04:05 3150
转载 自旋锁透彻分析
自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。 由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。 信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用(_trylock的
2014-04-30 18:00:07 1173
转载 存储性能瓶颈的成因、定位与排查
介绍企业数据存储性能瓶颈常常会发生在端口,控制器和磁盘,难点在于找出引起拥塞的单元,往往需要应用多重工具以及丰富的经验来查找并解决。本文详细阐述存储瓶颈发生最常见的四种情况,可能发生的拥塞点,需要监控的参数指标,以及部署存储系统的最佳实践。更多信息数据存储瓶颈的四个常见场景:以下是储瓶颈发生最常见的四种典型情况:1.当多个用户同时访问某一业务应用,无论是邮件
2014-04-30 17:56:14 1868
原创 结构体中的指针与零长度数组
0长度的数组在ISO C和C++的规格说明书中是不允许的,但是由于gcc 预先支持C99的这种玩法,所以,“零长度数组”在gcc环境下是合法的。先看下面两个例子。pzeroLengthArray.c#include struct str{ int len; char *s;};struct foo{ struct str *a;};int main(){
2014-04-30 17:30:21 3601
原创 整型溢出问题
整型溢出问题是常见问题,通过下面的例子去品味整型溢出的“乐趣”吧。#include /*对于unsigned整型溢出,C的规范是有定义的——“溢出后的数会以2^(8*sizeof(type))作模运算”,也就是说,如果一个gned char(1字符,8bits)溢出了,会把溢出的值与256求模。对于signed整型的溢出,C的规范定义是“undefined behavior”,也就是说,
2014-04-24 10:29:25 1615
原创 C语言谜题解析
本文汇总了一些容易犯错、不易察觉的C编程错误。有时候,你会遇到莫名其妙的错误而不知所措,本文中的一些例子可以给你提供经验,防患于未然。宏#include #define f(a,b) a##b#define g(a) #a#define h(a) g(a)int main(){ printf("%s\n", h(f(1,2))); printf("%s\n", g(f(1,2))); return 0;}说
2014-04-16 19:39:30 1481
原创 查看进程内存映像命令pmap
名称: pmap - report memory map of a process(查看进程的内存映像信息)用法 pmap [ -x | -d ] [ -q ] pids... pmap -V选项含义 -x extended Show the extended format. 显示扩展格式 -d
2014-04-15 19:05:23 2460
原创 跟踪进程栈命令pstack
pstack 命令必须由相应进程的属主或 root 运行,可显示每个进程的栈跟踪,可以使用 pstack 来确定进程挂起的位置。此命令允许使用的唯一选项是要检查的进程的 PID。 示例写了一个程序,sleep挂起,查看进程PID,用pstack查看,结果如下[root@SPA ~]# ps aux | grep testroot 2901 0.0 0.0 378
2014-04-15 18:55:39 1910
原创 Linux程序调试利器ltrace
作用 ltrace命令用来跟踪进程调用库函数的情况 调用 ltrace [-CdfhiLrStttV] [-a column] [-e expr] [-l filename] [-n nr] [-o filename] [-p pid] ... [-s strsize] [-u username] [-X extern] [-x extern] ...
2014-04-15 17:43:57 2089
原创 Linux程序调试利器strace
调用strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexpr ] ... [ -ofile ] [ -ppid ] ... [ -sstrsize ] [ -uusername ] [ -Evar=val ] ... [ -Evar ] ... [ command [ arg ... ] ]strace -c [ -eexpr ] ...
2014-04-15 17:29:24 1344
转载 来自腾讯无线研发的经验分享
在2014年4月11日的腾讯分享日活动上, 来自腾讯MIG的移动互联网事业群运营总监/T4专家,负责运营QQ手机浏览器、腾讯PC浏览器、腾讯手机安全管家、腾讯电脑管家产品的刘昕介绍了移动无线产品研发中的“一秒钟法则”。本文根据该演讲内容整理形成。移动互联网的一个很大问题在于无线网络跟以前的有线网络不一样,无论是网络的组织形态、架构、通讯机制,跟有线网络都有很大差异,这带来很多挑战。今天介绍的“
2014-04-15 15:31:25 1110
原创 洗牌算法分析总结
先定义出一个基本概念:究竟洗牌算法的本质是什么?也就是说,什么样的洗牌结果是“正确”的?一个比较确切的定义,在经过洗牌函数后,如果能够保证每一个数据出现在所有位置的概率是相等的,那么这种算法是符合要求的。在这个前提下,尽量降低时间复杂度和空间复杂度就能得到好的算法。第一个算法:随机抽出一张牌,检查这张牌是否被抽取过,如果已经被抽取过,则重新抽取,直到找到没被抽出过的牌,然后把这张牌放入
2014-04-12 14:10:22 1497 3
原创 C语言实现全排列
全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个;为了用递归的方式实现全排列,我们将整组数中的所有的数分别与第一个数交换,然后总是处理后n-1个数的全排列。 #include int count = 0;void swap(int *a, int *b){ int tmp = 0; tmp = *a; *a = *b;
2014-04-10 18:44:57 1566
原创 查找某个路径下的大文件并删除
在项目中,升级时发现磁盘空间已满,此时,必须得删除无用的,占用空间较大的文件。删除前,得找到那些满足一定大小的文件 查找根目录下大于5000KB的文件find / -type f -size +50000k
2014-04-10 15:50:07 2427
原创 git的安装与使用入门
最近看到一个内核注释的代码,想下载下来瞄一下,可,这代码是用git存储管理的,没办法,只能在自己的虚拟机上弄了。试用了下git,达到了我的目的。使用yum安装git[root@localhost install-pngynghay]# yum install git-coreLoaded plugins: fastestmirror, refresh-packagekit, secur
2014-04-10 11:22:53 1175
转载 性能调优
一、系统性能定义让我们先来说说如何什么是系统性能。这个定义非常关键,如果我们不清楚什么是系统性能,那么我们将无法定位之。我见过很多朋友会觉得这很容易,但是仔细一问,其实他们并没有一个比较系统的方法,所以,在这里我想告诉大家如何系统地来定位性能。 总体来说,系统性能就是两个事:Throughput ,吞吐量。也就是每秒钟可以处理的请求数,任务数。 Latency, 系统延迟。也就是系统在
2014-04-08 18:21:49 1194
转载 fork与行缓冲
题目:请问下面的程序一共输出多少个“-”? 如果你对fork()的机制比较熟悉的话,这个题并不难,输出应该是6个“-”,但是,实际上这个程序会很tricky地输出8个“-”。要讲清这个题,我们首先需要知道fork()系统调用的特性,fork()系统调用是Unix下以自身进程创建子进程的系统调用
2014-04-08 17:09:18 1152
原创 Linux终端进程管理必备命令
top命令是一个常用的查看系统资源使用情况和查看占用系统资源最多的进程的命令。top以列形式显示所有的进程,占最多CPU资源的进程会显示在最上面。ps命令可以列出正在运行的进程。pstree命令也可以显示进程信息。它以树的形式显示进程。kill命令可以根据进程ID来杀死进程。你可以使用ps -A,top,或者grep命令获取到进程ID。从技术层面来讲,kill命令可以发送任何信号给一个
2014-04-08 12:55:02 1315
原创 Linux终端彻底清空屏幕
Linux用户基本上都习惯使用clear命令或Ctrl+L组合快捷键来清空终端屏幕。这样做其实并没有真正地清空屏幕,但当用鼠标向上滚时,你仍然能看到之前的命令操作留下来的输出。命令 printf “\033c” 或者 printf “\ec”真正地清空了终端屏幕.它的工作原理是什么?\033 == \x1B == 27 == ESC 于是,这个命令变成了c,它是VT-XXX中表示“Fu
2014-04-08 12:49:33 5743
原创 模块参数与符号
模块参数module_param(name,type, perm);module_param_array(name, type, num, perm);perm表示该参数在sysfs文件系统中所对应的文件节点的属性;你应该使用中定义的权限值;这个值决定谁可以存取这些模块参数在sysfs文件系统中的表示;当perm为0时,表示此参数不存在sysfs文件系统下对应的文件节点;否则,
2014-04-03 13:58:02 1621
原创 likely && unlikely
likely和unlikely是gcc扩展的跟处理器相关的宏:#define likely(x) __builtin_expect(!!(x), 1)#define unlikely(x) __builtin_expect(!!(x), 0)现在处理器都是流水线的,有些里面有多个逻辑运算单元,系统可以提前取多条指令进行并行处理,但遇到跳转时,则需要重新取指令,这相对于不用重新去指
2014-04-03 13:09:53 3131
原创 container_of分析
container_of是一个伟大的宏,其实现非常巧妙,值得学习。功能:根据对象的一个成员指针获取该对象的指针#define container_of(ptr, type, member)({ /const typeof(((type*)0)->member)*__mptr=(ptr); /(type *)((char*)__mptr-offsetof(type,member));})
2014-04-03 13:06:19 1212
原创 海量数据处理常用数据结构及方法
大数据时代,海量数据的分析也成为了各大公司面试的热点问题。本文总结了几种常用的方法。 bitmap 适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下基本原理及要点:使用bit数组来表示某些元素是否存在;判重一般采用2-bitmap,即采用两个bit位来表示一个数据出现的次数(00表示未出现、01表示出现一次、10表示出现两次及其以上) 堆
2014-04-02 23:30:00 2130
原创 AVL树 VS 红黑树
平衡二叉树的追求的是全局均衡,如在做插入,删除操作时,需要调整整棵树,显然这是费时的,因此希望在做调整时,是局部调整,因此提出了红黑树,这样一种高效的数据结构(也是最变态的一种数据结构)。红黑树属于非严格意义上的平衡二叉树,说它不严格是因为它不是严格控制左、右子树高度或节点数之差小于等于1。但红黑树高度依然是平均log(n),且最坏情况高度不会超过2log(n),这有数学证明。所以它算平衡
2014-04-01 14:24:34 1875
原创 AVL树C语言完整实现
AVL树的介绍见http://blog.csdn.net/pngynghay/article/details/22443525,本文给出的是AVL树的一种实现。采用非递归方式,效率较好,经过常规测试。 #include #include #include #include #include typedef enum{ EH = 0, LH = 1, RH = -1
2014-03-31 18:39:06 2301
原创 AVL树及C语言实现
概念 平衡二叉树(Balanced binary tree)是由苏联数学家Adelson-Velskii and Landis于1962年首先提出的,所以又称为AVL树。定义:平衡二叉树或为空树,或满足如下性质的二叉树: (1)本身首先是一棵二叉搜索树 (2)左右子树深度之差的绝对值不超过1; (3)左右子树仍然为平衡二叉树.平衡因子BF=左子树深度-右子树深度.
2014-03-28 23:34:43 9565 2
原创 hash算法原理及常见函数
简介 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数
2014-03-28 21:33:25 4269 1
原创 合理估算线程池大小
服务器性能IO优化 中发现一个估算公式:最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目比如平均每个线程CPU运行时间为0.5s,而线程等待时间(非CPU运行时间,比如IO)为1.5s,CPU核心数为8,那么根据上面这个公式估算得到:((0.5+1.5)/0.5)*8=32。这个公式进一步转化为:最佳线程数目 = (线程等待时间与线程CPU时间之比
2014-03-28 12:40:11 1899
原创 双层桶
双层桶双层桶不是数据结构,只是一种算法思维,分治是其根本思想。在处理海量数据时,有着一席之地。当我们有一大堆数据需要处理,而局限于各种资源限制(内存、范围等)又不能一次处理完毕,此时,我们就需要将这一大堆数据分成我们可以处理的多个小段数据。然后,按照一定的策略处理各小段数据,从而完成既定目标。双层桶并不是要求我们只能把我们的大数据划分一次,双层是个虚指,如果有需要,可以把数据一层一层的
2014-03-26 23:34:11 2228
原创 Bloom Filter
Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不会漏掉判断。也就是Bloom Filter判断元素不在集合,那肯定不在。如果判断元素存在集合中,有一定的概率判断错误。因此,Bloom Filter不适合那些“零错误
2014-03-26 22:08:17 1275
原创 双堆求中位数及C实现
堆堆的动态创建与删除可参考http://blog.csdn.net/pngynghay/article/details/22101359,此处不再赘述。双堆求中位数算法描述:1、创建两个堆(一个小根堆、一个大根堆),堆大小至少为给定数据个数的一半,(size+1)/2,即向上取整;2、假定变量mid用来保存中位数,取定第一个元素,赋值给mid,即作为初始的中位数;3、依次遍
2014-03-26 20:54:17 2717
原创 堆的动态创建与根节点删除
堆的介绍与调整关于堆的介绍以及对于给定的完全二叉树,调整为大根堆或者小根堆,可以参考博文http://blog.csdn.net/pngynghay/article/details/22052737,在此不再赘述。本文主要是实现动态的创建一个堆,并且动态地向堆中插入元素,以及删除堆顶元素。堆的创建与删除操作分为大根堆与小根堆两种实现。头文件#include #include
2014-03-25 21:50:58 3177
原创 大根堆小根堆及其应用
堆的概念堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:Key[i]=Key[2i+1]&&key>=key[2i+2]即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]其中,大根堆和小根堆在海量数据的top N问题中,有着很好的时间复杂度
2014-03-25 12:49:14 11538
转载 VIM窗口分屏
分屏启动Vim使用大写的O参数来垂直分屏。vim -On file1 file2 ...使用小写的o参数来水平分屏。vim -on file1 file2 ...注释: n是数字,表示分成几个屏。关闭分屏关闭当前窗口。Ctrl+W c关闭当前窗口,如果只剩最后一个了,则退出Vim。Ctrl+W q分屏上下分割当前打开的文件。C
2014-03-24 20:25:58 1499
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人