摘要: 概述 : 保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。 临界区:在所有同步对象中,临界区是最容易使用的,但它只能用于同步单个进程中的线程。取得对某个数据区的访临界区一次只允许一个线程问权。还有,在这些同步对象中,只有临界区不是内核对象,它不由操作系统的低级部件管理,而且不能使用句柄来操纵,由于不是内核对象,使得它作为一种轻量级的同步机制,同 阅读全文
posted @ 2011-06-21 15:09 zsounder 阅读(573) 评论(0) 推荐(1) 编辑
摘要: 摘要: STL里有仿函数的概念,而在应用仿函数的时候,仿函数与仿函数之间的适配引出了约束器的概念。这一节主要叙述一下一元函数对象基类unary_function、二元函数对象基类binary_function,以及两个约束器binder1st与binder2nd,同时给出一个场景,分析实现原理。 1:template <class Arg, class Result> struct unary_function;2:template <class Arg1, class Arg2, class Result> struct binary_function; 3: tem 阅读全文
posted @ 2011-06-15 09:19 zsounder 阅读(414) 评论(0) 推荐(1) 编辑
摘要: 今天面试的时候,被问到了一个问题:release版本下new了一个对象A, 将A传入debug版本库,发生错误?可能的原因是什么呢?debug模式下: 1: // debug模式下的new 2: #define new DEBUG_NEW 3: 4: // DEBUG_NEW如下 5: #define DEBUG_NEW new(THIS_FILE, __LINE__) 6: 7: // 对于如上的new,编译器会寻找如下定义的operator new 8: void* AFX_CDECL operator new(size_t nSize... 阅读全文
posted @ 2011-03-28 22:29 zsounder 阅读(2347) 评论(0) 推荐(0) 编辑
摘要: 我没参加过笔试呢,不过经常有人拿着笔试中的问题来问我,特别是++、--运算符的问题, 其实这些问题应该从基本原理上理解一下,但是在笔试中这种问题还是有个简单的方法计算才好。总结以下的几条:1) 在计算中,对于一个作用域内的前缀操作数(++i),替换为i的最终数值,对于后缀操作符替换为原数值。2) 在printf,cout等依靠堆栈工作的方法中,对于一个作用域内的前缀操作符(++i),替换为i的最终数值,对于后缀操作符,按照入栈顺序分析。 1: int a ; 2: //-------------------------------------------------... 阅读全文
posted @ 2011-03-27 18:25 zsounder 阅读(886) 评论(0) 推荐(0) 编辑
摘要: 重载运算符是对正常函数的语法美化.没给语言增加任何基本的东西,但改善了可理解性并降低维护费用.当用户需要时,就应该使用运算符重载,但应该仅仅以用户熟悉的语义方式来使用它。1. 重载规则不能重载的运算符: . 和 .* 和 ?: 和 :: 和 sizeof 和 typeid重载运算符有两种基本选择: 类的成员函数或者友元函数, 建议规则如下:运算符建议使用所有一元运算符成员函数= () [] ->必须是成员函数+= -= /= *= ^= &= != %= >>= <<= , 似乎带等号的都在这里了.成员函数所有其它二元运算符, 例如: –,+,*,/友元函 阅读全文
posted @ 2011-03-27 17:35 zsounder 阅读(3057) 评论(0) 推荐(1) 编辑
摘要: 面向过程、面向对象、泛型编程(Generic Programming,简称GP)应该是三种重用的编程方法。传统的C++语言中,泛型编程思想仅仅体现于简单的模板技术。而之后引入的标准模板库STL(Standard Template Library)是泛型编程思想的实际体现和具体实现。1. 问题引入 面向过程的方法,可以将常用代码段封装在一个函数中,然后通过函数调用来达到目标代码重用的目的。 面向对象的方法,可以通过类的继承来实现(对象的目标)代码的重用。 如果需要编写一个可用于不同数据类型的算法,可以采用的方法有: 1). 面向过程的方法,对源代码进行复制和修改,生成不同数据类型版本的算法... 阅读全文
posted @ 2011-03-27 12:15 zsounder 阅读(1430) 评论(0) 推荐(0) 编辑
摘要: 1. Windows平台下主要的内存管理途径申请释放newdeletemallocfreeCoTaskMemAllocCoTaskMemFreeIMalloc::allocIMalloc/freeGlobalAllocGlobalFreeLocalAllocLocalFreeHeapAllocHeapFreeVirtualAllocVirtualFree2. 调用关系第一层:Win32 API作为系统的接口,提供了一组操作虚拟内存的接口;第二层:Heap作为虚拟内存的一部分,Win32 API又提供了一组操作Heap内存的接口,但是这些接口是建立在操作虚拟内存的接口的基础上。第三层:Windo 阅读全文
posted @ 2011-03-26 17:42 zsounder 阅读(2009) 评论(0) 推荐(1) 编辑
摘要: 对于字符数组与字符指针:1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0".2. 字符串直接量作为字符指针的初始值 "hello"是一个字符串直接量,编译器将其作为const char*处理,与之相关联的内存空间位于内存的只读部分,即允许编译器重用指向等价字符串直接量的引用以优化内存使用,即使程序 中使用了字符串直接量500次,编译器在内存中也只是创建了一个实例。例如: char *ptr = “hello”; 等价于 const char *ptr = “hello”;字 阅读全文
posted @ 2011-03-26 14:22 zsounder 阅读(5378) 评论(3) 推荐(4) 编辑
摘要: 1: #ifndef __INCvxWorksh 2: #define __INCvxWorksh 3: #ifdef __cplusplus 4: extern "C" { 5: #endif 6: /*...*/ 7: #ifdef __cplusplus 8: } 9: #endif 10: #endif /* __INCvxWorksh */显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用是防止该头文件被重复引用。3-9行的代码作用又是什么呢... 阅读全文
posted @ 2011-03-26 11:20 zsounder 阅读(434) 评论(0) 推荐(0) 编辑
摘要: C++中用const限定符来定义常量,但const出现的可以出现在常量定义中,也可以出现在方法定义中,并且出现的位置也有所不同,所表示的意思也不同。 在任何可能的情况下都要使用 const。在声明的变量或参数前加上关键字 const 用于指明变量值不可被篡改 (如 const int foo ). 为类中的函数加上 const 限定符表明该函数不会修改类成员变量的状态 (... 阅读全文
posted @ 2011-03-24 20:31 zsounder 阅读(948) 评论(0) 推荐(1) 编辑