C++
文章平均质量分 74
eriol
这个作者很懒,什么都没留下…
展开
-
计算类所占的字节数
类的大小只包括那些成员变量的大小,成员函数不计算在内。成员函数还是以一般的函数一样的存在。a.fun()是通过fun(a.this)来调用的。所谓成员函数只是在名义上是类里的。其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码。而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然不同的编译可能略有不...原创 2011-04-15 19:48:04 · 163 阅读 · 0 评论 -
Union的一点使用心得
Union的概念 “联合”是一种特殊的类,也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同的数据类型, 一个被声明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,已达到节省空间的目的(还有一个节省空间的类型:位域)。 这是一个非常特殊的地方,也是联合的特征。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。...原创 2011-09-07 21:57:32 · 92 阅读 · 0 评论 -
memcpy, memccpy和memmove
memcpy 声明:void *memcpy(void *dest, const void *src, size_t n)返回值:返回指向dest的指针。作用:memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束。 memccpy ...原创 2011-09-18 14:59:51 · 193 阅读 · 0 评论 -
回调函数(callback)和仿函数(functor)
回调函数(callback)与仿函数(functor)很多时候从用途上来看很相似,以致于我们经常将它们相提并论。例如: inline bool compare(int a, int b){ return a > b;} struct comparer { bool operator()(int a, int b) const { return...原创 2011-09-23 15:09:47 · 372 阅读 · 0 评论 -
智能指针的原理和实现
当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。...原创 2011-09-26 12:22:33 · 176 阅读 · 0 评论 -
boost智能指针shared_ptr
最近项目中使用boost库的智能指针,感觉智能指针还是蛮强大的,在此贴出自己学习过程中编写的测试代码,以供其他想了解boost智能指针的朋友参考,有讲得不正确之处欢迎指出讨论。当然,使用boost智能指针首先要编译boost库,具体方法可以网上查询,在此不再赘述。 智能指针能够使C++的开发简单化,主要是它能够自动管理内存的释放,而且能够做更多的事情,即使用智能指针,则可以再代码中n...原创 2011-09-26 12:37:15 · 152 阅读 · 0 评论 -
boost智能指针weak_ptr
循环引用 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象。一个简单的例子如下: #include <string>#include <iostream>#include <boost/shared_ptr.hpp>#include <boost/weak_ptr.hpp>...原创 2011-09-26 12:49:20 · 115 阅读 · 0 评论 -
析构函数与virtual
作为通常的原则,如果一个类定义了虚函数,那么它的析构函数就应当是virtual的。因为定义了虚函数则隐含着:这个类会被继承,并且会通过基类的指针指向子类对象,从而得到多态性。这个类可能会被继承,并且会通过基类的指针指向子类对象”,因此基类的析构函数是否为虚将决定子类的对象是否被析构。 #include <iostream.h>struct A{ ...原创 2011-09-26 14:57:16 · 144 阅读 · 0 评论 -
strcpy, memcpy, memmove, memset的实现
strcpy() 字符串拷贝 char *strcpy(char *strDest, const char *strSrc){ assert((strDest!=NULL) && (strSrc !=NULL)); char *address = strDest; while( (*strDest++ = * strS...原创 2011-10-15 17:12:09 · 118 阅读 · 0 评论 -
虚函数、虚指针和虚表
关于虚函数的背景知识用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。多态性是一个接口多种实现,是面向对象的核心。分为类的多态性和函数的多态性。多态用虚函数来实现,结合动态绑定。纯虚函数是虚函数再加上= 0。并且该函数只有声明,没有实...原创 2011-09-07 15:58:47 · 619 阅读 · 0 评论 -
C++虚函数表解析
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决定,要么试图做到运行时决定。 虚函数表 对C++了...原创 2011-09-07 14:58:50 · 97 阅读 · 0 评论 -
inline内联函数
C++ 内联函数(inline) 概念:内联函数是为了解决C++预处理器宏存在的问题所提出一种解决方案,用来提高函数使用效率。 目的:在程序编译时,编译器会将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。由于在编译时将内联函数体中的代码替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间开销上不象函数调用时那么大,所以它是以目标代码的增加为代价来换取时...2011-01-03 22:18:51 · 137 阅读 · 0 评论 -
extern “C" 揭秘
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。被extern "C"限定的函数或变量是extern类型的。 对于如下语句: extern int a; 仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会...原创 2011-05-23 11:18:18 · 121 阅读 · 0 评论 -
常量指针和指针常量
常量指针:即指向常量的指针。其定义为: const int* p; 它表示p是一个指向const int的指针,也就是说p指向的对象的内容不能改变,但是p可以指向其他的对象。所以,在这里不需要对p进行初始化,因为p可以指向任何东西(p不是一个const),但它所指的东西是不能被改变的。 指针常量:即指针是const类型的。其定义为: int d = 1;i...原创 2011-09-03 00:16:40 · 87 阅读 · 0 评论 -
C++初始化成员列表
C++在类的构造函数中,可以两种方式初始化成员数据:在构造函数的实现中,初始类的成员数据。还可以定义初始化成员列表 (Initializer list) 来初始化成员数据。 那么我们在什么情况下该使用初始化成员列表呢?需要初始化的数据成员是对象。需要初始化的类成员是const对象或者引用对象。解决没有默认构造函数的类成员对象的生成。在继承里面,只有初始化列表可...原创 2011-09-06 10:40:11 · 125 阅读 · 0 评论 -
C++中的内存区域
五大内存分区 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。 里面的变量通常是局部变量、函数参数等。 堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后...原创 2011-09-06 15:21:54 · 69 阅读 · 0 评论 -
C++中的static完全解析
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 一、面向过程设计中的static 1、静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: //Examp...原创 2011-09-06 16:09:18 · 119 阅读 · 0 评论 -
memset, memcpy和strcpy的比较
memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为''或'\0'。 函数原型:void *memset(void *s, int c, size_t n); 例如: char a[100];memset(a, '\0', sizeof(a)); memset也可以方便的清空一个结构类型的变量或数组。 st...原创 2011-09-06 21:18:06 · 174 阅读 · 0 评论 -
函数指针和指针函数
函数指针 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。 1. 函数指针定义 函数类型 (*指针变量名) (形参列表); “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名...原创 2011-09-07 13:58:05 · 92 阅读 · 0 评论 -
Linux下用C实现线程池
什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。 下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。...原创 2011-12-11 21:52:35 · 126 阅读 · 0 评论