摘要: 1. sizeof(string)的大小string属于类,类的大小就是类中成员变量(非静态)加上指向虚函数表的指针以及指向虚基类表的指针加起来的和。因为string是一个模板类,受具体的实现来决定其sizeof。实际上,到了C++中,对类的sizeof往往没有意义。这涉及到编译器在实现类对象时采用的数据结构。VC6.0:sizeof(string) = 16;VS2010:sizeof(string) = 32;可以发现std::string在VC6.0和VS2010里面的实现并不相同。2. new、delete与malloc、free的关系malloc与free是C++/C语言的标准库函数 阅读全文
posted @ 2013-08-16 10:32 虫不知 阅读(329) 评论(0) 推荐(1) 编辑
摘要: volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。volatile的本意是“易变的”,不过翻译成“直接存取原始内存地址”更为合适。“易变”是因为外在因素引起的,象多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化。一个参数可以既是const又是volatile,它 阅读全文
posted @ 2013-08-15 15:54 虫不知 阅读(297) 评论(0) 推荐(0) 编辑
摘要: 虚继承与一般继承 虚继承和一般的继承不同,一般的继承,在目前大多数的C++编译器实现的对象模型中,派生类对象会直接包含基类对象的字段。而虚继承的情况,派生类对象不会直接包含基类对象的字段,而是通过一个间接的指针去存取基类对象中的字段。 虚函数的实现原理 当编译器对程序进行编译碰到虚函数时,将不会赋予一个地址,而是插入一段汇编代码。每个包含虚函数的类都会由编译器产生一个虚函数表和一个虚函数表指针,其中虚函数表指针放在每个类的首地址处。当程序执行时,碰到对虚函数的调用,则通过插入的汇编代码到当前类的地址中找到虚函数表指针,通过虚函数的序号找到需要调用的虚函数。注意,... 阅读全文
posted @ 2013-08-14 20:53 虫不知 阅读(386) 评论(0) 推荐(0) 编辑
摘要: const成员函数作用1. 不能修改类的成员变量,同时不能调用类的非const成员函数。(const成员函数中,this的类型是一个指向const类类型对象的const指针,const成员函数返回*this作为一个const引用)。2. 提供了基于const的重载。const对象只能使用const成员函数。非const对象可以使用任一成员,但非const版本是一个更好的匹配。const形参:仅当函数形参是引用或指针时,可基于形参是指向const对象还是指向非const对象,实现函数重载。如果传递了const对象,则只有带const形参的版本才是调用的可行函数。如果传递的是非const对象,则两 阅读全文
posted @ 2013-08-13 21:10 虫不知 阅读(355) 评论(0) 推荐(0) 编辑
摘要: _cdecl(C Declaration的缩写)是C/C++和MFC程序默认使用的调用约定,因此可以省略,也可以在函数声明时加上_cdecl关键字来手工指定。采用_cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定,如函数printf()。由于每一个使用_cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。例子: void Input( int &m,int &n);/*相当于void _cdecl Input(int &m,int &n);*/ _std 阅读全文
posted @ 2013-08-13 20:35 虫不知 阅读(193) 评论(0) 推荐(0) 编辑
摘要: ACID,是指数据库管理系统(DBMS)在写入/异动资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,具有ACID特性。ACID的概念在ISO/IEC 10026-1:1992文件的第四段内有所说明。四大特性原子性:一个事务( 阅读全文
posted @ 2013-08-12 20:20 虫不知 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 页面置换算法在进程运行过程中,若其所要访问的页面不在内存而需要把他们调入内存中,但内存已经无空闲空间时,为了保证该进程能够正常运行,系统必须从内存中调出一页程序或数据送磁盘的对换区中。通常,把选择换出的页面的算法成为页面置换算法。置换算法的好坏将直接影响到系统的性能。1. 最佳置换算法(OPT)一种理想化的算法,具有最好的性能,但实际上却难于实现。其所选择的被淘汰页面,将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。采用最佳置换算法通常可以保证获得最低的缺页率。由于人们无法预知一个进程在内存的若干页面中,哪一个页面是未来最长时间不再被访问的,因而将算法无法实现。2. 先进先出页 阅读全文
posted @ 2013-08-11 17:24 虫不知 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 进程是程序的一次执行,线程可以理解为进程中的执行的一段程序片段。一个程序至少有一个进程,一个进程至少有一个线程。进程是操作系统资源分配的基本单位,而线程是操作系统执行的最小单位。地址空间和资源分配:进程有独立的地址空间,比如在linux下面启动一个新的进程,系统必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种非常昂贵的多任务工作方式。而运行一个进程中的线程,它们之间共享大部分数据,使用相同的地址空间,因此线程的创建,销毁及调度的开销一般都远小于进程。当然,线程拥有自己的局部变量和堆栈(注意不是堆)。通信:线程之间的通信比较方便。同一进程下的线程共享数据(比 阅读全文
posted @ 2013-08-11 15:55 虫不知 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 进程互斥、同步和通信的关系进程的同步与互斥是指进程在推进时的相互制约关系。为了保证进程的正确运行以及相互合作的进程之间交换信息,需要进程之间的通信。进程通信是指进程间的信息交换。两者有类似,但是差别很大,共通之处是,信号量和消息(事件)。PV操作作为进程的同步与互斥工具因信息交换量少,效率太低,称为低级通信。而高级通信则以较高的效率传送大批数据。Linux进程间的通信机制如下图所示:linux下进程间通信的几种主要手段简介:1. 无名管道(Pipe)及有名管道(Named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许 阅读全文
posted @ 2013-08-11 12:22 虫不知 阅读(639) 评论(0) 推荐(0) 编辑
摘要: 在操作系统中,进程是占有资源的最小单位。临界资源是指系统中一次只允许一个进程使用的资源(可以是硬件资源像打印机,也包括软件资源,如程序中的数据结构、表格和变量、文件等。)访问临界资源的那段代码称为临界区。进程同步:它主要源于进程合作,是进程间共同完成一项任务时直接发生相互作用的关系。为进程之间的直接制约关系。比如说进程A需要从缓冲区读取进程B产生的信息,当缓冲区为空时,进程B因为读取不到信息而被阻塞。而当进程A产生信息放入缓冲区时,进程B才会被唤醒。进程互斥:主要源于资源共享,是进程之间的间接制约关系。进程互斥就是保证每次只有一个进程使用临界资源。比如进程B需要访问打印机,但此时进程A占有了打 阅读全文
posted @ 2013-08-10 21:28 虫不知 阅读(1971) 评论(0) 推荐(0) 编辑