Cpp编程
文章平均质量分 56
egraldloi
DBOSps:是博客更是笔记欢迎纠错
展开
-
C++模板分离编译问题
今天在写程序中踩到一个坑:模板编译问题,现在原创 2014-05-11 19:25:24 · 699 阅读 · 0 评论 -
C++实现高性能哈希表
构建哈希表的时候,必须指定有多少个bucket,下面我们以6个bucket为例,当我们指定哈希规则为模6的话,哈希表初始化的时候是建立6个bucket。首先由6个指针分别指向这6个bucket,然后申请具体的6个bucket所需要的空间,且每个bucket所需要的空间后面有两个指针,这两个指针一个指向这个bucket中的空闲位置,还有一个是指向当此bucket溢出之后重新申请空间的bucket,比原创 2014-07-30 13:15:25 · 1578 阅读 · 0 评论 -
eclipse使用技巧
1, 当导入工程出现 make: *** 没有规则可以创建目标“all”。 停止。的时候 首先检查你makefile中的all是否为“All”,如果是那就改过来 如果上面的规则不行,再看看debug是否在build的路径中,右击工程-->属性-->C/C++构建-->构建位置,在构建位置中是不是你导入工程的debug目录。(这只是在工程含有debug目录的情况下)2,加原创 2013-10-12 16:04:39 · 1464 阅读 · 0 评论 -
const char*,char *和string之间的转换
const char *和char *,还有string之间的转换为:1,const char *转换为char *就是首先申请一段空间,然后复制进去,不能直接赋值是因为const const char *pp="aaa"; char *p=new char[enoughspace]; strcpy(p,pp);2,char *转换为const char*可以直接赋值原创 2014-03-25 17:46:33 · 1668 阅读 · 0 评论 -
一个C++线程池
当一个作业来的时候,能够在线程池中取出一个线程来run这个作业,这在服务器代码中尤其常见。1,为什么要用线程池?一些对象的创建和销毁会很耗用资源,“池化资源”能够尽可能的减少创建和减少销毁对象的次数,其采用的多线程机制也能显著的减少处理器单元的闲置时间。2,线程池的实现线程池主要分为四个组成部分:线程池管理器,工作线程,任务接口和任务队列线程池管理器主要是管理创建线程池和销毁线程池中原创 2013-10-12 16:04:52 · 920 阅读 · 0 评论 -
C语言中的volatile关键字
谈谈我理解和总结的volatile关键字吧,volatile关键字是C语言不常用的一个关键字,估计很多人都没听说过,我们项目中由于多线程设计的时候也是用到了volatile关键字,特此总结一下:1,首先说一下编译器优化。原创 2014-09-16 18:53:47 · 761 阅读 · 0 评论 -
合并两个排序数组
这是leetcode中的合并两个排序数组的题目,题目为:A和B两个数组已经排序,A可以容纳A和B的数组,我的思路为:将A往后移,因为移动之后就不用再移动了,然后合并就不需要总是去赋值。原创 2014-07-31 13:58:25 · 880 阅读 · 0 评论 -
后缀表达式求值--leetcode第二题
后缀表达式求值的输入是一个string的数组,或者vector。还得建一个辅助栈,存储当前需要计算的两个数值。这个可以扩展为database中的expression系统,满足数据库中所有的计算。例如aggregation函数,系统函数,基本数值计算(需要设计所有数据类型处理)。原创 2014-07-12 19:15:30 · 1128 阅读 · 0 评论 -
shuffle的简单实现
在分布式系统的实现中,shuffle是一个非常关键的操作,直接决定算法在分布式环境下执行的可行性。shuffle被称为数据混洗,它在某些并行系统中被称作exchange。shuffle最简单的实现方式就是对数据做某种策略上的切分(比如说哈希切分,比如说范围切分),然后可以选择切分之后的数据直接传输或者将数据持久化供容错,我们比较一下这两种方式。原创 2014-08-04 15:36:38 · 1551 阅读 · 0 评论 -
多线程之信号量--生产消费者问题
在诸如生产者消费者问题中,信号量被广泛使用,前段时间网上流传的奶茶京东的例子,就是一个信号量的问题。下面以生产者消费者问题为例,说一下信号量和锁的结合应用:一般有两个信号量:对于生产者的缓冲区可用资源数目和对于消费者的产品可用的资源数目。一般有两个函数指针:生产者函数指针在生产,消费者函数指针在消费。这个两个函数指针指向的函数中如果是多线程情况会有锁来避免多个线程修改缓冲区。代原创 2014-04-22 23:35:44 · 846 阅读 · 0 评论 -
禁用copy构造函数
如果你定义一个空类,编译器自动为你做的就是申明四个函数,分别是:1,构造函数2,copy构造函数3,copy assignment构造函数4,析构函数比如:原创 2013-10-23 09:46:08 · 811 阅读 · 0 评论 -
运行时多态与编译时多态
运行时多态是显示接口,一般由基类+virtual实现,在基类中写好子类有可能要实现的函数接口,在运行时绑定父类指针究竟指向哪个子类的函数编译时多态是隐示接口,一般由template(模板)实现,优点是如果程序需要反复调用其中的接口函数,例如来处理大量数据,运行时多态的性能必然赶不上template,编译期多态已经在编译的时候就确定要调用的函数,而运行时多态会在每次调用函数的时候都要做判断要调用原创 2013-12-08 17:44:57 · 1043 阅读 · 0 评论 -
C++中基类中应该有虚析构函数
当一个类中一旦有虚函数的时候,这个类的内存空间就会维护一张虚函数表,这张虚函数表会浪费类所占用的内存空间,同时虚函数是运行时多态,一旦函数被调用的次数非常多,就会产生性能的瓶颈,一般在数据库中的物理算子的实现中,会有这种情况的发生,因为数据库所处理的数据条数有时候是很多的。但是如果一个基类的析构函数如果不是虚函数,我们看会发生什么事情。#include using namespace s原创 2014-01-11 22:26:14 · 859 阅读 · 0 评论 -
返回值为函数指针
今天项目中用到函数指针,故做笔记。函数指针的声明和普通变量的声明很不一样,在此返回值为int,输入参数为两个int的函数指针为:函数指针声明为:int (*func)(int,int)返回函数指针的函数声明为:int (*fun())(int,int)见代码:#include using namespace std;class Test{public: Test(){原创 2014-02-24 17:03:46 · 960 阅读 · 0 评论 -
传值传地址和传引用
传值传地址和传引用的小结或者笔记程序的目的是在改变两个指向整形的指针的指向,也就是在改变指针的值见代码:#include using namespace std;void swap1(int *x,int *y){ //传递的是指针的值,形参和实参并不是同一个对象 //交换的是形参(两个指针)的值,实参中两个指针的指向并没有发生改变 int *tmp; tmp=x; x原创 2014-02-17 09:39:39 · 860 阅读 · 0 评论 -
多个线程barrier操作--条件变量
在多个线程协同工作时,有一种应用为,当多个线程都完成工作之后,才进行下一阶段的工作,最典型的为hashjoin算法中的build阶段并行化。在build阶段,多个线程同时读取一个relation建立hash表,在此我们不考虑线程之间写hash表冲突造成的性能降低。N个线程读relation然后build hash表,N个线程都完成工作之后,才能开始下一步的probe阶段,否则probe阶段“见原创 2014-03-26 22:54:59 · 1260 阅读 · 0 评论 -
epoll原理和应用
前段时间在项目中用到了select系统调用来实现非阻塞IO,但是select系统调用的缺点如下:1,select监听的fd的个数有个上限值,1024,也就是当server端同时接受来自1024个客户端的网络连接,就会出现FD_SETSIZE的限制,但是这个缺点有解决方法,就是通过修改宏定义或者重新编译内核来修改FD_SETSIZE的值。2,select会维护一个存储要监听的所有文件描述符的数原创 2013-10-12 16:04:27 · 833 阅读 · 0 评论 -
归并排序C++版
归并排序首先找中间节点。如果是链表,利用快慢指针寻找中间节点,如果是数组,直接使用(start+end)/2找到中间节点位置,链表版本中,需要O(1)的空闲复杂度去存一个头节点,而数组版本,需要O(N)的空间复杂度需要构造一个缓存数组存下所有节点。两种版本的实现时间复杂度都是O(N*logN)。下面看代码原创 2014-07-15 09:19:40 · 655 阅读 · 0 评论