
C/C++
文章平均质量分 80
zp373860147
互联网 Python C/C++ 底层机制
展开
-
c++ 模版函数的定义和实现放在一个文件中
今天使用模版函数,遇到一个问题。当我定义一个类,并且将它的一个成员函数定义为模版类型时,需要将该模版函数的实现与该类放在一个文件中。比如在a.h中定义了class a:class a{ ... template a(const T& t); };其中函数使用了模版,那么该模版函数的实现需要也放在a.h中,如果放在a.cpp中,那么在使用时可能会出现error LNK原创 2012-03-15 19:01:51 · 15166 阅读 · 0 评论 -
boost::any实现分析
这里提到的boost::any,下面来分析一下boost::any的实现。class any { public: // structors any() : content(0) { } template any(const ValueType & value)原创 2013-03-19 17:09:58 · 3706 阅读 · 0 评论 -
如何设计接口的参数以减少对接口的修改
或许说这个东西的时候,最好能依托一个背景。在稍大型一点的项目中,总会有一个base层,我们认为它封装了最最底层和基础的一些列功能,因为底层的东西追求稳定和运行效率,所以90%是用C/C++写的,一般以头文件+DLL的方式给上层使用(不考虑它是基于COM的,如果是COM,VARIANT的参数类型就不在讨论范围内了)。头文件中定义了一些列导出函数或者导出类,这些导出函数或类的成员函数,都会原创 2013-03-19 15:19:53 · 4157 阅读 · 1 评论 -
多线程数据同步总结(二)
性能问题凡是涉及到多线程数据同步都会有额外的性能开销。常见的同步方式按照性能开销从小到大(主要是耗时的多少)排序为:volatile读取、volatile写入、Interlocked API、SRWLock、关键段(带旋转锁)、内核对象。使用内核对象,比如互斥量、信号量等的开销最大,因为这时以切换到内核态,而从用户态切换到内核态,大概需要1000个CPU指令周期。关键段原创 2012-11-19 14:56:18 · 947 阅读 · 0 评论 -
boost中的mutex与lock
最近在多线程编程中多次使用到mutex来互斥,看了下项目的代码,有自己封装的mutex类,也有直接使用boost::mutex的,而boost中关于mutex可谓令人眼花撩换。这里总结一下。对于mutex和lock,要明确一点,真正起到互斥作用的mutex,而lock可以认为是协助mutex令我们在使用时更方便。搞不清楚二者关系的可以参考这里:从高中一次半夜不冲厕所的经历谈程序原创 2012-11-15 15:41:09 · 10106 阅读 · 0 评论 -
多线程数据同步总结
在线程安全的单间类中提到了InterlockedCompareExchangePointer函数及CAS(Compare and swap)技术,或者成为Lock Free,及使用系统提供的基于cpu指令的无锁多线程数据同步技术。这里打算稍微学习并总结下windows平台下常用的多线程数据同步方法以及他们的区别。多线程同步,最常用的应该是加锁。常见的方式有临界区、信号量、互斥锁等。临界原创 2012-11-14 14:46:07 · 985 阅读 · 0 评论 -
理解 Thread.Sleep 函数 ,Sleep(0) 释放当前线程所剩余的时间片,让线程马上回到就绪队列而非等待队列
原文章连接:http://www.cnblogs.com/ILove/archive/2008/04/07/1140419.html我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题:假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在转载 2012-11-14 15:36:34 · 7224 阅读 · 2 评论 -
线程安全的单间类
在网上看到一篇关于将线程安全的单例实现,http://www.haogongju.net/art/1688900。下面是他提到的出自google的源码:template class LazySingleton {public: static Ty_& GetInstance(){1: while(me_ == NULL || me_ == (void*)-1){2:原创 2012-11-13 11:17:09 · 975 阅读 · 0 评论 -
c++模版的一些使用方法(三)
c++模版的应用是可以分类的。按照用途,可以分为: 1)工程模版 2)算法和数据结构的解耦 3)工作于编译期的模版 4)XX的封装 5)适配器模式首先解释一下,这里的划分属于较高层的应用划分,但这些应用都是基于模版的一些共同特性的,比如带默认参数、特化和偏特化等。分别解释一下就是:(1)工程模版:《c++模版的一些使用方法(一)》中提到修改第三方库的应用属原创 2012-04-21 16:52:31 · 712 阅读 · 0 评论 -
c++模版的一些使用方法(四)
接着(三)的内容说,设计模式中有一种适配器模式,它的意思是,当两个接口不匹配时,创建一个适配器在中间进行转接,使原本不能在一起工作的两个接口可以在一起工作。这种类型不匹配的情况在普通代码层也会经常出现,比如函数的参数类型,模版的参数等。那么模版也可以起到适配器的作用。很好的例子是traits,stl中可以发到大量的使用。下面例子Responst类是一个模版类,接受一个参数T,要求T类型有一个fun原创 2012-04-21 18:04:16 · 595 阅读 · 0 评论 -
c++模版的一些使用方法(二)
c++模版的其他技巧:1.编号生成器考虑下面的场景,对于int、char、double、bool、float这5种类型,我们希望对他们进行类型编号1-5,并且确保对于每种类型,它的编号不会改变,即每次调用函数获取该编号时,他都是唯一的且不变的。那么使用通过定义一个模版函数实现。int g_id=0;//全局id计数templateint GetTypeId(){ s原创 2012-04-16 17:43:23 · 1566 阅读 · 0 评论 -
c++模版的一些使用方法(一)
在一个项目中,我认为c++模版的主要应用是对一些基础组件的封装。因为基础组件往往是供上层开发人员使用的,并且它一般具有不确定性和支持的旷阔性,stl的容器是个很好的例子。容器支持n中类型,这表现了它的广阔性,它又可以通过顺序和链式实现,这表现了不确定性。我把这些“重量级”的应用认为是模版的主要应用。此外,有使用技巧的人也会通过使用模版来“耍一些小聪明”,这指的是通过模版简单化很多工作。这里原创 2012-04-16 16:23:22 · 946 阅读 · 0 评论 -
一道考指针的题
(1)void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } 请问运行Test函数会有什么样的结果? 答:没错,子函数中动态原创 2011-09-21 11:36:25 · 956 阅读 · 0 评论 -
使用宏灵活的控制代码
这个系列记录了前一个项目中的一些心得,《接下来一段时间的工作》列了一个目录。不过具体记录时,没有按照目录的顺序。第一篇记一下关于宏的一些使用。有一些(特别是纯C++)程序猿,认为宏在代码中的作用不大,尤其是使用const XXX代替宏的号召使得很多刚开始学习C或者转为C++的人放弃了使用宏。其实宏有很多用处,尤其是纯C或者嵌入式编程中,比如:1.求一个结构体中某类型的偏移量、字节数等原创 2012-04-14 19:22:19 · 2996 阅读 · 0 评论 -
动态申请内存与释放时的异常---Byte越界(CheckBytes函数的内部机制)
今天在堆代码的时候,堆了下面一段代码,Debug时异常,Release没问题。const std::string &sFilename;wchar_t *wcstring = (wchar_t *)malloc(sizeof(wchar_t)*(sFilename.length()-1)); m_hDLL = ::LoadLibrary(/*stringToLPCWSTR(sFil原创 2011-11-20 11:16:49 · 7271 阅读 · 1 评论 -
Dynamic Data Exchange(DDE)机制引发的卡死
有一个bug:在XP系统下,某些机器上ShellExecute在打开文件时会造成程序卡死,看了Dump文件,堆栈如下:说明ShellExecute内部使用了DDE,即Dynamic Data Exchange,动态数据交换技术。DDE用于进程间通讯,需要两个Windows应用程序,其中一个作为服务器处理信息,另外一个作为客户机从服务器获得信息。客户机应用程序向当前所激活的服务器应用原创 2013-03-21 11:38:52 · 2402 阅读 · 0 评论