代码改变世界

随笔分类 -  c/c++

单例模式

2014-07-18 22:10 by 钱吉, 241 阅读, 收藏, 编辑
摘要: 一:什么叫单例模式?单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然... 阅读全文

c++类型转换

2014-07-18 22:09 by 钱吉, 209 阅读, 收藏, 编辑
摘要: 一:implicit cast二:explicit castconst_caststatic_castdynamic_castreinterpret_cast const char *pArray = "helloworld"; //char *pNonConst = pArray;//... 阅读全文

类模板和函数模板

2014-07-18 22:07 by 钱吉, 155 阅读, 收藏, 编辑
摘要: 类的成员函数是模板函数时的特例化:class Test{public: Test() {}; ~Test() {}; template void calc(T val); /*{ coutvoid Test::calc(T val){ coutvoid Test::calc(int val){ c... 阅读全文

读写锁的实现

2014-07-18 21:59 by 钱吉, 419 阅读, 收藏, 编辑
摘要: 读写锁在多线程应用中经常用到。适用于读线程多余写线程的场合。对读线程读取共享资源时不加锁,而对写线程写共享资源时进行加锁控制。先说一下读线程控制:只要此时没有写操作,就可以进行读取。一旦有写操作,则阻塞等待。对于写线程来说,如果此时有读线程正在读取资源,则等待其读取完,然后判断是否所有的读线程是否已... 阅读全文

三种数据队列的实现

2014-06-25 10:46 by 钱吉, 1323 阅读, 收藏, 编辑
摘要: 1 /** 2 * 文件名称:dataqueue.h 3 * 摘 要:本文件实现了三种数据队列:简单队列,单队列类和双数据队列类。 4 1) 简单队列:使用List库,动态分配内存,使用临界区保证互斥 5 2)单队列:采用链表实现,一... 阅读全文

关于宏##的使用注意一点

2014-03-08 23:02 by 钱吉, 14136 阅读, 收藏, 编辑
摘要: 在看《C语言高级编程》时,里面有个关于宏##的题目:1.已知#define A “menu”#define B “osd”,若请使用宏A,B表示出字符串”menuosd”答案:1 答案1:#define C A B答案2:#define _C_(a,b) a##b#define C(a,b) _C_(a,b)然后我实际动手测试了一下,先来第一种:#include #define A "menu"#define B "osd"#define STR A Bint main(int argc, char *argv[]){char *p = STR;retu 阅读全文

如何创建一个简单的C++同步锁框架(译)

2013-11-17 14:38 by 钱吉, 8609 阅读, 收藏, 编辑
摘要: 翻译自codeproject上面的一篇文章,题目是:如何创建一个简单的c++同步锁框架目录介绍背景临界区 & 互斥 & 信号临界区互斥信号更多信息建立锁框架的目的BaseLock类临界区类构造/拷贝构造析构Lock/TryLock TryLockFor 解锁信号量类构造/拷贝构造析构Lock/TryLock/TryLockFor 解锁释放互斥类构造/拷贝构造析构Lock/ TryLock/TryLockFor 解锁无锁类实现自动释放锁类实现例子声明同步对象声明带初始计数的信号量对象声明跨进程的互斥/信号量对象同步示例1 (手动加锁) 同步示例2 (自动加锁) 同步示例3 (Tr 阅读全文

线程池(译)

2013-11-17 14:04 by 钱吉, 1468 阅读, 收藏, 编辑
摘要: 这是我翻译的codeproject上面的一篇文章,题目是:线程池一 简介 我的应用中,需要将数据备份到不同的地方(CD,USB,网络共享)。如果我只用单线程来做这件事情,需要花2个小时以上。而如何改善性能对我来说是一个挑战,最终我用多线程来实现了这个问题,结果非常可观,只用了30分钟就完成了我的工作。 其实在刚开始开发时,备份耗费了一整天,后来我被迫增加频率到1个小时。现在我发现了一个问题:实际中由于频率过低导致线程频繁的重复创建和销毁。怎么解决这个问题?为什么线程不能被重复利用呢?所以这就是线程池的由来。你是否需要线程池?你有多个请求需要被重复和并行处理吗?每个请求能独立工作吗?你需要等.. 阅读全文

如何利用循环代替递归以防止栈溢出(译)

2013-11-15 09:36 by 钱吉, 21384 阅读, 收藏, 编辑
摘要: 摘要:我们经常会用到递归函数,但是如果递归深度太大时,往往导致栈溢出。而递归深度往往不太容易把握,所以比较安全一点的做法就是:用循环代替递归。文章最后的原文里面讲了如何用10步实现这个过程,相当精彩。本文翻译了这篇文章,并加了自己的一点注释和理解。目录 简介模拟函数的目的递归和模拟函数的优缺点用栈和循环代替递归的10个步骤替代过程的几个简单例子更多的例子结论参考协议1简介 一般我们在进行排序(比如归并排序)或者树操作时会用到递归函数。但是如果递归深度达到一定程度以后,就会出现意想不到的结果比如堆栈溢出。虽然有很多有经验的开发者都知道了如何用循环函数或者栈加while循环来代替递归函数,以防止. 阅读全文

c++模板函数实例化的偏序机制

2013-08-17 12:28 by 钱吉, 2948 阅读, 收藏, 编辑
摘要: 一:废话 今天在stackoverflow上看到一个关于c++模板specialization的问题:http://stackoverflow.com/questions/18283851/template-specialization-in-case-of-multiple-base-templates-in-c/18283933?noredirect=1#comment26823443_18283933他的English好像不是很标准(说不定是India三哥,哈哈),但比我强多了。废话不多说,问题简述如下://#1template void foo(X a){ cout void... 阅读全文

计算机编码字符小结(ascii,unicode,utf-8)

2013-04-27 17:15 by 钱吉, 292 阅读, 收藏, 编辑
摘要: 在一个好朋友的QQ空间看到的(QQ空间也有技术文章,让我着实惊讶),转过来。为了保密就不注明地址了,应该不会被砍吧?点了无数次鼠标才找到一篇通俗易懂的关于“字符编码”的博文,现就将其摘录下来,一为笔记,二为交流。------------------------------------------------------------------------------------------------------------------------------------今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料。结果,这个问题比我想象的复杂,从午饭后 阅读全文

短小精悍的宏(整理篇)

2013-04-27 11:57 by 钱吉, 3032 阅读, 收藏, 编辑
摘要: c/c++里面常常需要定义一些宏,以提高编程效率和调试,同时使得代码结构简练。这里从网上查找了一下,并集中整理,方便以后使用。个别地方加了一点自己的注释(红色字体表示)。其实都是些小儿科的编程技巧了,请勿见笑,只是想方便像我这样的新手共同学习。一:#、##和__VA_ARGS__(转自:http://www.cnblogs.com/zhujudah/admin/EditPosts.aspx?opt=1)1.#假如希望在字符串中包含宏参数,ANSI C允许这样做,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化成字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相 阅读全文

字符编码及文件读取的基础知识

2012-12-12 22:19 by 钱吉, 1509 阅读, 收藏, 编辑
摘要: 这是以前写的一点笔记,把它转过来。1、二进制文件和文本文件首先看二段代码:生成一个二进制文件和一个文本文件。打开一个二进制文件:test.dat,写入整数1234,其对应的十六进制为04D2。 FILE *pfile; int ntest = 1234; if(NULL == (pfile=fopen("test.dat","wb"))) { printf("can't write file:test.dat"); return(1); } fwrite(&ntest,sizeof(int),1,pfile); fcl 阅读全文

求所有最大公共子序列的算法实现

2012-11-15 23:55 by 钱吉, 10078 阅读, 收藏, 编辑
摘要: 最近看了很多关于LCS(Longestcommonsubsequenceproblem,最长公共子序列)的文章,大部分问题都只是求出最大公共子序列的长度,或者打印处其中的任意一个最大子序列即可,但是如何快速的打印出所有的最大长度子序列?这个问题好像看到的不多。本文给出了传统的DP(dynamicprogramming,动态规划)算法进行求解的过程,并用c语言实现。另外参考一篇论文实现了其中的一种打印所有最大公共子序列的算法,这个算法比起传统的算法而言,时间复杂度大大降低.一:LCS解析首先看下什么是子序列?定义就不写了,直接举例一目了然。如对于字符串:“student”,那么su,sud,su 阅读全文

c和c++中const的区别

2012-11-09 17:58 by 钱吉, 419 阅读, 收藏, 编辑
摘要: 关于常量指针,首先看这段代码:const int test = 5;const int *pm = &test;int *pn = pm;printf("%d\n",(*pn)++);printf("%d\n",*pm);printf("%d\n",test);在C语言中标准中,编译器可以通过非const指针修改const值(我用gcc 4.6.1,输出结果:5,6,6)。而如果这段代码放在c++中编译时是通不过的(第二行报错:无法将int *转换为const int *)。为什么C标准不会对这种行为排斥,因为C标准只是规定c 阅读全文

c/c++的异常统一处理

2012-11-07 23:01 by 钱吉, 1392 阅读, 收藏, 编辑
摘要: 今天看HTK代码,发现里面的错误处理机制很好,所以自己在这里总结一下。如何将某些类型的错误集中起来统一处理,使得程序易于维护和具有更好的可读性。这里假设有这样一个故事,有个美女征婚,理想中的男人如果要表白成功,需要具备6个条件:玫瑰(Rose),戒指(Ring),宝马(BWM),高(Tall),富(Rich),帅(Handsome)。(好吧,我承认这个故事很低俗,但是实在想不出其它例子来比喻了,将就着看吧,-_-)。如果少了一个条件,sorry,美女要抛出异常了。但是现在求婚的人太多,美女无暇顾及,所以决定先请人把关,再根据把关人反馈的结果统一处理。好了,先看C语言如何处理:C语言错误统一处理 阅读全文

尾递归和编译器优化

2012-10-30 15:47 by 钱吉, 2511 阅读, 收藏, 编辑
摘要: 最近看到尾递归,所谓的尾递归wiki解释如下:尾部递归是一种编程技巧。递归函数是指一些会在函数内调用自己的函数,如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说,亦容易优化成为普通循环。这是因为从电脑的基本面来说,所有的循环都是利用重复移跳到代码的开头来实现的。如果有尾部归递,就只需要叠套一个堆栈,因为电脑只需要将函数的参数改变再重新调用一次。利用尾部递归最主要的目的是要优化,例如在Scheme语言中,明确规定必须针对尾部递归作优化。[1][2]可见尾部递归的作用,是非常依赖于具体实现的。(http://zh.w 阅读全文

练手系列(链表)

2012-10-20 16:04 by 钱吉, 334 阅读, 收藏, 编辑
摘要: 简单的单向链表的实现,主要功能包括:链表反转 元素获取 链表合并。LinkList.h 1 #ifndef _HEADER_LINKLIST_CLASS 2 #define _HEADER_LINKLIST_CLASS 3 #include <iostream> 4 using namespace std; 5 6 typedef struct _ListNode 7 { 8 int data; 9 _ListNode *pnext;10 11 }ListNode,*pListNode;12 class LinkList13 {14 public:15 LinkLis... 阅读全文

反汇编学习

2012-10-11 18:50 by 钱吉, 3378 阅读, 收藏, 编辑
摘要: (转:http://www.kuqin.com/assemble/20071122/2492.html)汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机) ============================ x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx. 在汇编语言中,... 阅读全文

typedef声明数组及在二维数组申请中的应用

2012-03-12 16:48 by 钱吉, 1301 阅读, 收藏, 编辑
摘要: 基础知识练习,随便写写,关于指针,数组,typedef的应用.#define MAXLINE 1024typedef char Pom[MAXLINE];int main(){ char *pTest[10] = {"abcd","defg"};//指针数组初始化 char MyArray[MAXLINE] = {"hello,world!"}; char *p1 =MyArray; char **p2 = &p1;//指针的指针。pp3=&pp是错的,&pp为数组地址,&pp+1将指向数组的最后,即加 阅读全文