c/c++
文章平均质量分 76
tattarrattat
A man,a pIan,a canal---Panama
展开
-
关于搜索引擎及其开发
<br /><br /> 托google、百度们成功的福,搜索引擎火了半边天。很多人都想跨到这个行业里边来。前两天在公司里边面试了一些人,基本上没有感到满意。不是说从业经验不够,有些也已经工作了三年、四年。不过我估计,或者说是猜想,是不是做应用做的时间太长了,把数据结构、算法,时间、效率都扔到一边去了;然后平时的工作又太忙,平时自己工作的做的可以,但对工作相关的、稍微扩展的知识没有时间或者说是懒得去看了。。。。。<br /> 我的想法是,如果有兄弟姐妹要进入这个行业,最好对这个行业流行的想法、做法了解一转载 2011-03-23 17:07:00 · 3210 阅读 · 2 评论 -
通用线程:POSIX 线程详解,第 2部分 互斥对象
通用线程:POSIX 线程详解,第 2部分 称作互斥对象的小玩意转载 2008-06-10 14:36:00 · 685 阅读 · 0 评论 -
hash算法和常见的hash函数
Hash,一般翻译做“散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre--mage),通过散列算法,变换成固定长度的输出,该输出就是散列值。 这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能 会散列成相同的输出,而不可能从散列值来唯一的确定输入值。 数学表述为:h = H(M) ,其中H( )--单向散原创 2008-06-12 16:13:00 · 21970 阅读 · 3 评论 -
c 指针
1。 指针的类型。 从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型: (1)int *ptr; //指针的类型是int * (2)char *ptr; //指针的类型是char * (3)int **ptr; //指针的类型是 int **(4)int (*ptr)[3]; //指针的类型原创 2008-06-02 15:59:00 · 836 阅读 · 0 评论 -
memset memcpy strcpy strcat 用法 技巧
char * strcat(char * dest, const char * src){ char *tmp = dest; while (*dest) dest++; while ((*dest++ = *src++) != /0) ; return tmp;}stat原创 2008-05-22 18:04:00 · 1320 阅读 · 0 评论 -
vim+ctags+taglist+cscope+cppcomplete+global
转贴一篇关于vim扩展的文章(ctags, taglist,cppcomlete~~)Entry vim+ctags+taglist+cscope+cppcomplete+global (此文首先发表于LinuxSir.Org,在此仅做收录。 http://www.linuxsir.org/bbs/showthread.php?t=241578)由于本人比较喜欢在终端状态下的vim,原创 2008-05-16 11:22:00 · 3003 阅读 · 0 评论 -
c 字符串转换函数
atof(将字串转换成浮点型数) 相关函数 atoi,atol,strtod,strtol,strtoul 表头文件 #include 定义函数 double atof(const char *nptr); 函数说明atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(/0)才结束转载 2008-07-28 17:58:00 · 1445 阅读 · 0 评论 -
memset strcpy memcpy 比较
memset用来对一段内存空间全部设置为某个字符。memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象。strcpy就只能拷贝字符串了,它遇到/0就结束拷贝。memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:char a[100] ;memset(a, /0, sizeof(a));memcpy用来做内存拷贝,你可原创 2007-08-27 16:53:00 · 1716 阅读 · 0 评论 -
fork的一个例子
#include ;#include ;main (){ pid_t pid; pid=fork(); if (pid printf("error in fork!"); else if (pid == 0) printf("i am the child process, my原创 2007-08-27 16:07:00 · 999 阅读 · 1 评论 -
通用线程:POSIX 线程详解,第 3 部分 使用条件变量提高效率
通用线程:POSIX 线程详解,第 3 部分 使用条件变量提高效率转载 2008-06-10 14:53:00 · 762 阅读 · 0 评论 -
POSIX 线程详解(一) 一种支持内存共享的简捷工具
POSIX 线程详解 一种支持内存共享的简捷工具转载 2008-06-10 14:21:00 · 760 阅读 · 0 评论 -
Posix线程编程指南
2001 年 10 月 01 日这是一个关于Posix线程编程的专栏。作者在阐明概念的基础上,将向您详细讲述Posix线程库API。本文是第一篇将向您讲述线程的创建与取消。 线程创建 1.1 线程与进程相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。在串行程序基础上引入线程和进程是为了转载 2008-06-10 17:24:00 · 729 阅读 · 0 评论 -
关于开源的网络爬虫/网络蜘蛛larbin结构分析的一篇非常不错的文章
<br /> larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人 Sébastien Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎提供广泛的数据来源。Larbin只是一个爬虫,也就是说larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情 larbin也不提供。一个简单的larbin的爬虫可以每天获取500万的网页。<br /><br /> 利用larbin,我们可以轻转载 2010-09-14 15:02:00 · 1454 阅读 · 0 评论 -
C语言经典问答
1.这样的初始化有什么问题?char *p = malloc(10); 编译器提示“非法初始式” 云云。答:这个声明是静态或非局部变量吗?函数调用只能出现在自动变量(即局部非静态变量) 的初始式中。因为静态变量的地址必须在编译的过程中就确定下来而 malloc()申请的内存地址是在运行时确定的。2. *p++ 自增p 还是p 所指向的变量?答:后缀++ 和-- 操作符本质上比前缀一目操作的优先级高, 因此*p++ 和*(p++) 等价, 它自增p 并返回p 自增之前所指向的值转载 2010-06-22 17:25:00 · 1798 阅读 · 1 评论 -
宏定义
<br /> <br /> <br /> <br />14.3 宏定义<br />我们从第2章以来使用的宏被称为简单的宏,它们没有参数。预编译器也支持带参数的宏。本节会先讨论简单的宏,然后再讨论带参数的宏。在分别讨论它们之后,我们会研究一下二者共同的特性。<br />14.3.1 简单的宏 <br />简单的宏定义有如下格式:<br />[#define指令(简单的宏)] #define 标识符 替换列表 <br />替换列表是一系列的C语言记号,包括标识符、关键字、数、字符常量、字符串转载 2010-06-22 17:49:00 · 4024 阅读 · 0 评论 -
C之诡谲
指针,数组,类型的识别,参数可变的函数。 一.指针。 它的本质是地址的类型。在许多语言中根本就没有这个概念。但是它却正是C灵活,高效, 在面向过程的时代所向披靡的原因所在。因为C的内存模型基本上对应了现在von Neumann (冯·诺伊曼)计算机的机器模型,很好的达到了对机器的映射。不过有些人似乎永远也 不能理解指针【注1】。 注1:Joel Spolsky就是这样认为的,他认为对指针的理解是一种aptitude,不是通过训练 就可以达到的。指针可以指向值、数组、函数,当然它也可以作为值使用。 看下面的几转载 2010-06-17 15:01:00 · 1074 阅读 · 0 评论 -
linux下的deamon进程
<br />设计一个linux下的deamon进程,关键只有几个:<br />1.fork两次。<br />2.fork第一次和第二次之间成为进程组头。<br />3.改变工作目录。<br />4.忽略信号。<br />5.设置读写掩码。<br />一下是一个从网络搜集到的例程,非常好的演示了上述要点,存此备忘。<br />#include <br />#include <br />#include <br />#include <br />void ma原创 2010-07-21 17:51:00 · 972 阅读 · 0 评论 -
c++ 多态 虚函数 析构函数 抽象类
1. 析构函数和虚析构函数 如果基类的析构函数是虚的,那么它的派生类的析构函数都是虚的 这将导致:当派生类析构的时候,它的所有的基类的析构函数都将得到调用 否则,只调用派生类的析构函数(这可能导致基类的某些对象没有得到释放) 所以CObject类的析构函数是虚的,所有由它派生的类析构的时候一级一级的进行,不会造成内存泄漏。 无论基类的原创 2009-05-07 15:47:00 · 6492 阅读 · 5 评论 -
LINUX动态链接库高级应用
1LINUX动态链接库高级应用 在《LINUX下动态链接库的创建与应用》 一文中,我介绍了LINUX动态链接库的基本知识.其要点是:用户根据实际情况需要,利用dlopen,dlsym,dlclose等动态链接库操作函 数,装入指定的动态链接库中指定的函数,然后加以执行.程序中使用很少的动态函数时,这样的做法尚可.如果程序需要调用大量的动态函数,原创 2008-11-19 11:03:00 · 857 阅读 · 1 评论 -
libtool 的使用。
http://www.gnu.org/software/libtool/manual/libtool.html#Using-libtoolThe examples in this chapter introduce the main features of libtool by comparing the standard library building procedure to libtool原创 2008-11-18 14:01:00 · 6187 阅读 · 0 评论 -
size_t 和 ssize_t
size_t 是为了方便系统之间的移植而定义的 在32位系统上 定义为 unsigned int 在64位系统上 定义为 unsigned long 更准确地说法是 在 32位系统上是32位无符号整形 在 64位系统上是64位无符号整形 size_t一般用来表示一种计数,比如有多少东西被拷贝等 sizeof操作符的结果类型是size_t, 该类型保证能容纳实现所建立的最大对象的字节大小。原创 2007-08-17 15:24:00 · 1675 阅读 · 1 评论 -
[转载]UNIX程序的链接
转载地址:http://bbs.chinaunix.net/archiver/?tid-779785.html UNIX链接处理 我们已经知道链接实际上是指将在一个模块中引用的符号与它在另一个模块中的定义相链接的过程。并且我们还知道链接分为动态链接和静态链接两种方式。不论是 对哪一种方式。链接程序都将搜索程序中的每一个模块,包括所用到的每一个库文件,以在这些文件中寻找在某个模块中没有定义的外部符号转载 2007-08-14 11:59:00 · 1114 阅读 · 0 评论 -
C++代码优化方法总结
优化是一个非常大的主题,本文并不是去深入探讨性能分析理论,算法的效率,况且我也没有这个能力。我只是想把一些可以简单的应用到你的C++代码中的优化技术总结在这里,这样,当你遇到几种不同的编程策略的时候,就可以对每种策略的性能进行一个大概的估计。这也是本文的目的之所在。目录: 一. 优化之前 二. 声明的放置 三. 内联函数 四. 优化你的内存使用 五. 速度优化 六. 最后的求助一. 优转载 2006-11-15 23:19:00 · 905 阅读 · 0 评论 -
C++中包含有虚函数的单继承状态下的类的内存布局
如下测试代码:#includeiostream>using namespace std;class base...{ public: base() ...{ cout"create base"endl; }; virtual ~base() ...{ cout"clean base"endl; }; virtua转载 2006-11-15 23:26:00 · 931 阅读 · 0 评论 -
C/C++动态内存创建与内存管理
1 内存空间逻辑组织A 静态数据区:内存在程序启动的时候才被分配,而且可能直到程序开始执行的时候才被初始化,如函数中的静态变量就是在程序第一次执行到定义该变量的代码时才被初始化。所分配的内存在程序的整个运行期间都存在,如全局变量,static变量等。注意:初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过void*来访问转载 2006-11-15 22:53:00 · 1043 阅读 · 0 评论 -
memcpy和memmove的区别与实现
memcpy和memmove函数的实现 区别:从DESCRIPTION看来,两者的功能基本相同,唯一不同的是,当 dest 和 src 有重叠的时候选用不同的函数可能会造成不同的结果。不妨写个小程序来测一下: 0 #i nclude 1 #i nclude 23 int main()4 {5 int i = 0;6 int a[10]转载 2006-11-15 22:28:00 · 1898 阅读 · 0 评论 -
类的构造函数、析构函数与赋值函数
构造函数、析构函数与赋值函数是每个类最基本的函数。它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险。 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A产生四个缺省的函数,如 A(void);转载 2006-11-15 22:18:00 · 782 阅读 · 0 评论 -
关于this指针
初学者对this指针真的是很好奇,因为它很神秘。其实,只要以平常心来看待,this就很平常了。1. this只能在成员函数中使用。全局函数,静态函数都不能使用this。实际上,成员函数默认第一个参数为T* const register this。如: class A{public: int func(int p){}};其中,func的原型在编译器看来应该是: int func(A* cons转载 2006-11-15 23:25:00 · 786 阅读 · 0 评论 -
操作符重载
3种实现方式:成员函数;友员函数;普通函数。 class Employee { protected: // … public: // … Employee & operator ++() { Age ++; return *this; } friend Employee & operator --(转载 2006-11-15 23:12:00 · 755 阅读 · 0 评论 -
C++ 虚函数 多态
1、什么是虚函数和多态 虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行晚绑定,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。通常此类指针或引用都声明为基类的,它可以指向基类或派生类的对象。 多态指同一个方法根据其所属的不同对象可以有不同的行为(根据自己理解,不知这么说是否严谨)。 举个例子说明虚函数、多态、早绑定和晚转载 2006-11-15 23:33:00 · 912 阅读 · 0 评论 -
C++中的强制类型转换
关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++ 的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面对它们一一进行介绍。 3转载 2006-11-15 23:29:00 · 4049 阅读 · 0 评论 -
堆和栈的详细介绍
堆和栈的区别一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)转载 2006-11-15 23:36:00 · 3932 阅读 · 0 评论 -
高质量C++/C编程指南 -- 第7章 内存管理 (2)
高质量C++/C编程指南 -- 第7章 内存管理 (2)7.7 杜绝“野指针”“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。“野指针”的成因主要有两种:(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气转载 2006-12-02 17:35:00 · 891 阅读 · 0 评论 -
#ifdef的用法
#ifdef的用法 灵活使用#ifdef指示符,我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码。 代码举例:新建define.cpp文件#include "iostream.h" int main() { #ifdef DEBUG cout #endif return 0; } 运行结果为:Press any key to c转载 2007-08-14 10:30:00 · 1229 阅读 · 0 评论 -
高质量C++/C编程指南 -- 第7章 内存管理 (1)
高质量C++/C编程指南 -- 第7章 内存管理 (1)程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本章的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。7.1内存分配方式内存分配方式有三种:(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内转载 2006-12-02 17:41:00 · 1002 阅读 · 0 评论 -
(转)关于继承,不同继承方式,对于派生类成员以及基类的可见性
通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。 在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。 派生类的定义格式 单继承的定义格式原创 2006-12-02 17:28:00 · 1954 阅读 · 0 评论 -
sizeof 用法总结(转)
sizeof 用法总结(转)sizeof有着许多的用法,而且很容易引起一些错误。下面根据sizeof后面的参数对sizeof的用法做个总结。 A. 参数为数据类型或者为一般变量。例如sizeof(int),sizeof(long)等等。这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。例如int类型在16位系统中占2个字节,在32位系统中占4个字节。转载 2006-12-02 17:45:00 · 1425 阅读 · 0 评论 -
高质量C++/C编程指南 -- 第5章 常量
高质量C++/C编程指南 -- 第5章 常量常量 常量是一种标识符,它的值在运行期间恒定不变。C语言用 #define来定义常量(称为宏常量)。C++ 语言除了 #define外还可以用const来定义常量(称为const常量)。5.1 为什么需要常量 如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?(1) 程序的可读性(可理解性)变差。转载 2006-12-02 17:43:00 · 757 阅读 · 0 评论 -
高质量C++/C编程指南 -- 第6章 函数设计
高质量C++/C编程指南 -- 第6章 函数设计函数设计函数是C++/C程序的基本功能单元,其重要性不言而喻。函数设计的细微缺点很容易导致该函数被错用,所以光使函数的功能正确是不够的。本章重点论述函数的接口设计和内部实现的一些规则。函数接口的两个要素是参数和返回值。C语言中,函数的参数和返回值的传递方式有两种:值传递(pass by value)和指针传递(pass by po转载 2006-12-02 17:42:00 · 791 阅读 · 0 评论 -
高质量C++/C编程指南 -- 第8章 C++函数的高级特性
高质量C++/C编程指南 -- 第8章 C++函数的高级特性第8章 C++函数的高级特性对比于C语言的函数,C++增加了重载(overloaded)、内联(inline)、const和virtual四种新机制。其中重载和内联机制既可用于全局函数也可用于类的成员函数,const与virtual机制仅用于类的成员函数。重载和内联肯定有其好处才会被C++语言采纳,但是不可以当成免费的午餐而滥用。本章转载 2006-12-02 17:33:00 · 922 阅读 · 0 评论