- 博客(48)
- 收藏
- 关注
原创 C++类对象创建过程揭密
介绍初看到这个题目,你可能会有些疑惑:C++类对象的创建还有什么好说的,不就是调用构造函数么?实际上情况并不是想象中的那么简单,大量的细节被隐藏或者被忽略了,而这些细节又是解决一些其他问题的关键,所以我们很有必要深入到这块"神秘"的区域,去探索鲜为人知的秘密。 分配空间(Allocation)创建C++类对象的第一步就是为其分配内存空间。对于全局对象,静态对象以及分配在栈区域内的对象,对它们的内存
2007-07-29 13:02:00
8428
2
原创 一次有意义的面向对象设计尝试
前言 上一周由于工作的需要,我尝试运用面向对象的设计思想来解决实际工作中遇到的一个设计问题。整个设计过程主要涉及到C++语言,OO编程思想,设计模式这三个方面的知识,是对我软件设计能力的一次综合考验。虽然最后由于种种原因,我的设计方案并没有获得采纳,但是这个并不重要,重要的是在整个设计过程中我自己思考过,并提出了我的方案,也就是说,我在这次设计过程中学到了很多。我决定把这次设计记录下来,一方面是
2007-07-21 14:17:00
3412
2
原创 Inside COM Object Model
前言C++对象模型经常会受到大家的关注,这个可以从论坛中大量的和C++对象模型有关的帖子就可以看出来,但是我却很少看到讨论COM组件模型的讨论和文章。我现在正在作一些和COM有关的工作,对这个问题也比较感兴趣,我就想自己写一篇关于这个主题的文章。本文的名字是借用一本非常著名的书的名字,那就是。选择这个名字是不是有借助这本书的名气"炒作"自己的嫌疑?呵呵,可能有一点吧。但是这决不是我使用这个名字的真
2007-05-12 11:27:00
3134
原创 Segment/Section/Virtual Memory/Page之间的区别
注:对于Segment,Section,Virtual Memory,Page这些词我们肯定不会陌生。但是在我们阅读一些书籍和文章的时候,不知道是那些作者的缘故还是自己的原因,我们不能正确区分他们之间的区别。我不得不承认,真要100%弄清楚这些概念并不是一件容易的事情,因为他们涉及到很多不同方面的内容(例如编译/连接,汇编,操作系统),同时这些内容本身就不太容易掌握。但是我想写这篇文章,一方面是为
2007-05-06 14:08:00
6373
原创 Merge Two Sorted Single-linke List
引言在解决某个算法问题的时候,我们经常会遇到这样的情况:单纯解决这个问题本身并不难,但是如果在解决问题的同时我们还需要考虑到时间复杂度和空间复杂度,这时候情况就显得稍微复杂一点。那么对于某个具体的问 题,我们如何才能设计出高效的算法呢?本文通过对一个具体问题的分析试图阐述一个这样的观点:对题目已知条件的充分挖掘和理解是设计出高效算法的前提。近日在CSDN上看到一个关于单链的算法题:
2007-03-31 11:00:00
3864
2
原创 OpenCV1.0在VS下的安装和配置
关于OpenCV在VS IDE下的安装和配置,一些热心的网友已经分享了它们的成功经验,这里有一篇很好的文章。这里我无意重复这些内容,我想强调的是,在配置OpenCV开发环境的时候,除了满足能够正常工作外,我们还可以从移植和维护的角度多考虑一下。我们可能需要注意以下几个方面的问题: 1. 配置的开发环境最好要独立于OpenCV的安装目录。设想这样的情况,我们需要将OpenCV工程转移到另外一台
2007-03-13 19:41:00
9575
6
原创 网络资源收集(02/12/2007-02/16/2007)
Windows NT 4.0在前一篇"网络资源收集"中我提到了Windows平台下的对象(Object)和句柄(Handle)的一些内容。从一些文章的内容中我发现Windows NT 内核从v4.0开始对用户对象(USER)和GDI对象做了重大的调整,即将用户对象和GDI对象移入到内核模式(Kernel Mode)中。这些发现激发了我对Windows NT Architecture的兴趣,也搜到了
2007-02-15 11:17:00
3112
原创 虚函数表放在哪里?
引言:近日CSDN的"C/C++语言"版的一个问题引起了我的注意:"请问虚函数表放在哪里?"。我也曾经思考过这个问题,零零散散也有一定的收获,这次正好趁这个机会把我对这一部分的理解整理一下。 首先值得声明的是,本文的编译环境是VS2002+WinXP。C++标准并没有对虚函数的实现作出任何的说明,甚至都没有提到虚函数的实现需要用虚表来实现,只不过主流的C++编译器的虚函数机制都是通过虚表来实现的,
2007-01-28 14:09:00
19482
6
原创 网络资源收集(01/15/2007-01/19/2007)
引子在日常的工作和学习中,随着了解的深入和涉猎的范围越来越广,不了解的内容越来越多。有些内容在工作中很少涉及,但是不能保证以后也用不上,这时候对知识的收集和整理就显得尤为重要。实际上,对知识的收集和整理也可以看作是工作的重要组成部分,我现在可以不太清楚某个方面的内容,但是不代表我永远不了解这样的内容,良好的信息整理工作可以使我很轻松的定位到我需要的内容,这样在实际工作中可以节省大量的时间,极大的提
2007-01-18 15:37:00
3438
原创 对单链(Single-Linked List)操作的思考
前言对于单链(single-linked list)的考察频繁的出现在各种各样的考试题和面试题中。这其中的原因,一方面是因为单链的使用相当广泛,更重要的是单链的使用非常灵活,某些单链的操作对程序员的算法分析能力和灵活思考能力有很高的要求。本文通过对几个有代表性的单链算法的分析试图寻找解决单链问题的"万能钥匙",最起码也为提供一个通用的思路。单链的特性在进入到具体的算法分析之前,我觉得有必要分析
2007-01-09 14:57:00
6768
10
原创 反转字符串中的单词(Reverse Words)
前言:在前面一篇文章中,我们在反转长度不等的两块连续内存块的算法的基础上推导出了反转长度不等的两块不连续内存块的算法。在本文中,我将使用前文分析的算法去解决一个更复杂的问题:反转字符串中的单词。引子话说有这样一道算法题:PROBLEM:Reverse WordsCOMMENT:Write a function that reverses the order of the words in a st
2006-12-16 11:43:00
11470
原创 交换两段不连续的内存块(Swap Nonadjacent Memory Blocks)
问题:如何交换两段不连续的内存块?分析篇这道题是编程珠玑,第二版>第二章后的一个习题。看过这本书的朋友一定会对书中第二章介绍的用来交换两段连续的内存块的"reversal algorithm"一定记忆犹新。"reversal algorithm"无论在时间复杂度还是在空间复杂度上都有良好的表现,更重要的是它的实现相当简单:1。假设有两段连续的内存块a和b;2。首先对内存块a进行反转:a = re
2006-12-10 14:55:00
5513
原创 透过汇编另眼看世界之类成员函数指针
前言:在CSDN论坛经常会看到一些关于类成员函数指针的问题,起初我并不在意,以为成员函数指针和普通的函数指针是一样的,没有什么太多需要讨论的。当我找来相关书籍查阅了一番以后,突然意识到我以前对成员函数指针的理解太过于幼稚和肤浅了,它即不像我以前认为的那样简单,它也不像我以前认为的那样"默默无闻"。强烈的求知欲促使我对成员函数进行进一步的学习并有了这篇文章。一。理论篇在进行深入学习和分析之前,还是先
2006-11-25 12:35:00
4523
2
原创 透过汇编另眼看世界之DLL导出函数调用
前言:我一直对DLL技术充满好奇,一方面是因为我对DLL的导入/导出机制还不是特别的了解,另一面是因为我发现:DLL技术在Windows平台下占有重要的地位,几乎所有的Win32 API都是以导出函数的形式存放于不同的DLL文件中,在DLL方面的学习是任何一个想深入研究Windows内部机制的Windows程序员都不可能回避的事实。我在查阅了大量的文章后,对DLL技术有了一定的了解,所以我写了这篇
2006-11-19 12:45:00
4414
2
原创 透过汇编另眼看世界之多继承下的虚函数函数调用
在我的前一篇文章"透过汇编另眼看世界之函数调用"中,我们通过汇编了解了虚函数调用的全部过程。在本文中我将分析多继承的情况下虚函数调用的情况。首先还是写一些简单的代码作为本文分析的例子代码: //the abstract base classclass IBase ...{public: virtual void func1() = 0; virtual void func2
2006-11-04 14:19:00
5786
5
原创 Windows下动态内存分配方式
这里的"动态内存"包含以下两个方面的内容: 1.内存。这里的"内存"指的是进程的虚拟内存空间。在Win32环境下,每一个进程拥有独立的,大小为4G(0x0000 0000 ~ 0xFFFF FFFF)的虚拟内存空间。 2.动态。这里的"动态"指的是进程虚拟内存空间中的动态内存区域。在一个进程的虚拟内存空间中,只有动态内存可以在运行是被应用程序自由的分配/使用/释放。在Win32环境下,我们
2006-10-21 13:36:00
5790
原创 透过汇编另眼看世界之函数调用
在我的另外一篇文章中 ,我提到了要通过汇编语言来分析虚函数调用的真相。我们现在就开始踏上这次艰辛却非常有意思的旅程。其他闲话少说,直接进入主题。本文中使用的C++代码:#include "stdafx.h"#include iostream>class CBase {public: virtual void callMe();};class CDerived: public CBas
2006-10-15 09:45:00
4379
原创 抓虫记(1)
近日浏览CSDN时,看到了网友贴的一个关于百度面试题的帖子,其中有一道是改错题,实际上就是找出代码中可能存在的BUGs,这个题是这样的:下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位为1)中的大写字母转化为小写字母,请找出其中的bug,注意各种异常情况。 for (char *piterator = szWord; *piterator != 0; pi
2006-09-24 15:06:00
4822
3
原创 Learn From Real Coding (1)
注:大学毕业后,我就进入到一家软件公司从事AutoCAD应用程序开发。在随后的日子里我想通过BLOG的方式记录下我在实际工作中学习到的东西(也就是人们常说的"经验",很宝贵的哟!),然后和大家分享我的经验,也希望能和大家对相关问题进行深入的讨论。写这些的另外的一个目的记录下我成长的历程。标题:Learn From Real Coding - 1关键词:C++中的函数重载和默认值摘要:函数重载和
2006-08-26 12:39:00
2750
原创 复杂表达式的执行步骤
近日在CSDN上闲逛的时候,注意到一个帖子: ((*strDest++=*strSrc++)!=/0); 哪儿前辈可以解释下里面具体执行的步骤呢? 对于这样的表达式,我们通常会有这样三种看法:1.这种写法不但没有错误(当然也没有BUG),而且写法紧凑。2.这种写法虽然没有错误,但是不够直观,理解起来有点麻烦,可能还会导致理解错误。3.这种写法中存在未定义的地方,执行结果可能是错误的。粗略来
2006-08-20 10:12:00
3339
4
原创 面向对象地本质-抽象
什么是面向对象的本质?近日在阅读一位网友在CSDN博客上发表的文章,作者认为对象,对象的职责,以及对象之间的交互构成了OO思想的本质。在我看来,抽象更接近OO思想的本质。我是从以下几点考虑的:1.抽象使我们更接近于事物的本质。抽象的过程就是一个提炼存在于事物之间共同拥有的元素,而这些事务之间共同拥有的元素往往是这一事物区别于其他事物关键的东西,这些元素就构成了事物的本质。2.抽象的思
2006-06-07 20:28:00
5072
原创 关于多态
近日浏览CSDN论坛,发现了一个关于如何理解多态的帖子。自我感觉学习C++已经有很长一段时间了,但是叫我说什么是多态,我却无法组织的思路。虽然我可以找出一本C++书,按照上面说的意思告诉你多态是什么,但是我感觉这样并没有真正理解多态,这样做有点"死记硬背"的意思。我觉得,理解多态应该注意区分设计(Design)和实现(Implementation)。1。多态的概念更倾向于Design,所以
2006-04-01 11:14:00
3085
原创 MFC中的设计模式之厂(Factory)
引子:网上对MFC的批评不绝于耳,说MFC这样,那样不好,甚至有网友直接用“烂”来形容MFC。我学习MF C也有一段时间了,我自己感觉我的MFC水平也就是中等偏下,离熟练运用MFC还有一段距离。我深刻体会到学习MFC的“痛苦”,所以在工作中我一般都尽量避免使用MFC。前几天在CSDN中看到关于MFC中用到了那些设计模式的讨论,顿时觉得这是一个很有意义的讨论。为什么我们不可以换一个角度,从实现者的角
2006-03-03 20:14:00
2225
原创 OpenGL常识汇总
OpenGL常识汇总主题:这里将收集一些OpenGL中的常识。在日常生活中,我们积累生活常识越多,我们的生活就会越方便。同样的道理,如果我们积累的OpenGL常识越多,我们的开发过程就会越轻松。当列举这些常识的时候,我会尽量找到充分的,权威的资料去证明常识的正确性。通常情况下,我会摘抄经典书籍中的原话作为证据。闲话少数,现在就开始吧。1.坐标系在计算机图形学中有关于坐标系的内容。常见的
2006-02-12 10:47:00
3045
原创 程序天天练(2):字符串中删除子字符串
Ex: 字符串中删除子字符串Date:Jan. 8th, 2005思路:在书中有从字符串中删除一个字符的例子,从这个例子出发,将一个字符扩展到一个字符串即可。分析:从一个字符串s中删除一个字符c的思路:1.用两个变量i,j分别表示源字符串下一个字符的index和目标字符串下一个字符的index.2.遍历源字符串的每一个字符,取其中的任意一个字符,若此字符不等于c,保存此字符,并且j加1;否则丢弃此
2005-01-08 10:23:00
2911
原创 程序天天练(1)
注:这些练习都来源于C经典教程《The C Programming Language,2nd》。做这些练习目的是培养一种编程思想(效率,重用...),而不是简单的实现功能。Ex: Exercise 1-12 Write a program that prints its input one word per line.Date: 2005.1.6Solution 1: 1.判断每一个输入的字符
2005-01-06 14:22:00
1594
原创 3D Graphics Pipeline
注:看了许多关于Pipeline的资料,对于Pipeline也有一定的了解,但是总觉得还是模模糊糊的,似懂非懂的样子,对于Pipeline中各个阶段,仍然没有理清它们之间的相互关系,所以下决心写一些关于Pipeline的东西,写的过程也是一个加深理解的过程,我需要达到的目标是当我闭上眼睛的时候,我能很从容的讲出整个3D 图形流水线的工作过程。这样为以后的图形引擎设计,图形引擎优化打下坚实的基础。闲
2005-01-02 15:12:00
2931
原创 微软ATC二面:电话面试
我参加了Microsoft ATC 11.13那一次的笔试,感觉做的不好,两道大的编程题都没有作出来,想着是没有戏了。可是前天却很意外的接到的ATC的电话,通知我电话面试。原本已经恢复平静的心又开始激动起来,又回到了前一段时间找工作的状态,心里猜测着可能遇到的问题,在网上找相关的面经。虽然感觉希望不大,但是我还是很珍惜这一次机会,对我来说,确实是一次很好的经历。第二天下午3:30,我准时接到的北京
2005-01-01 11:47:00
5484
1
原创 CamShift算法,OpenCV实现(3):CamShift算法
1.原理在了解了MeanShift算法以后,我们将MeanShift算法扩展到连续图像序列(一般都是指视频图像序列),这样就形成了CamShift算法。CamShift算法的全称是"Continuously Apaptive Mean-SHIFT",它的基本思想是视频图像的所有帧作MeanShift运算,并将上一帧的结果(即Search Window的中心和大小)作为下一帧MeanShift算法的
2004-11-23 10:49:00
15675
7
原创 CamShift算法,OpenCV实现2-Mean Shift算法
这里来到了CamShift算法,OpenCV实现的第二部分,这一次重点讨论Mean Shift算法。在讨论Mean Shift算法之前,首先讨论在2D概率分布图像中,如何计算某个区域的重心(Mass Center)的问题,重心可以通过以下公式来计算:1.计算区域内0阶矩for(int i=0;i for(int j=0;j M00+=I(i,j)2.区域内1阶矩:for(int i=0;
2004-11-10 15:06:00
22391
6
原创 CamShift算法,OpenCV实现1--Back Projection
CamShift算法,即"Continuously Apative Mean-Shift"算法,是一种运动跟踪算法。它主要通过视频图像中运动物体的颜色信息来达到跟踪的目的。我把这个算法分解成三个部分,便于理解:1) Back Projection计算2) Mean Shift算法3) CamShift算法在这里主要讨论Back Projection,在随后的文章中继续讨论后面两个算法。Back P
2004-11-10 13:55:00
20271
8
原创 Light Mapping
Light Mapping是一种比较"便宜"的实现各种光照效果的技术。它虽然实现的是光照效果,但是确实通过纹理贴图来实现的。它的基本思想是:将需要的光照效果保存在纹理中,然后和几何体表面的其他纹理通过一定的方式"混合"在一起来实现效果。根据Light Mapping实现的效果不同,可以将纹理贴图分为:Diffuse Light Mapping:实现漫反射效果Specular Light Map
2004-11-10 11:07:00
2262
原创 游戏引擎之:可视性判断
可视性判断是指:能够根据给定的相机位置与方向,快速地计算出一个场景中有那些内容是可见的,并对场景中的可见部分进行渲染处理。可视性判断主要进行以下几种类型的判断:1. 判断三角形面的正面和背面。三角形面的正面和背景由手向性决定的:左手坐标系:三角形面的三个顶点按顺时针排列时,法向量所指的方向时正面,和法向量相反的方向时背面。右手坐标系:三角形面的三个顶点按逆时针排列时,法向量所指的方向时正面,和法向
2004-11-02 14:23:00
2959
原创 提取视截面
在Frustum Culling的计算中,我们需要提取出视截面。那如果计算视截面呢?首先,我们需要了解平面的表示方法:平面的数学表达式是:Ax+By+Cz+D=0;若A,B,C组成的向量(A,B,C)等于平面的单位法向量,则|D|表示原点到此平面的距离。若D>0,则原点位于平面的正面(法向量所指的一面);若D这样,用一个四维向量可以很方便的表示一个平面:缩写记号来表示满足方程NQ+D=0中点Q组成
2004-10-31 19:50:00
1921
原创 游戏引擎之:渲染(shading)
整个渲染过程应该分为两个大的部分: 1) material synthesis(材质综合),包括纹理和表面属性。 2) illumination(光照),包括各种光照模型和渲染模型。在这里主要涉及到的内容是illumination。在OpenGL中,若需要计算光照模型(light model),就需要在指定顶点(vertex)的时候,为顶点添加两个属性:1) 顶点的颜色;2) 顶点出的法向向量
2004-10-31 09:57:00
6338
2
原创 3D图形学中的数学:法向量的变换
顶点的切线向量和法向量:用来表示该顶点士如何融合到周围的曲面中的。顶点的切线向量和法向量的变换:设M是4*4的一个变换矩阵,分以下几种情况讨论:1) 若M表示一个平移的变换,则切线向量和法线向量不变:T=T; N=N 。2) 若M表示一个正交矩阵,则切线向量和法向向量也满足M变换:T=MT; N=MN 。2) 若M表示一个非正交矩阵,则切线向量满足M变换:T=MT,但是法向向量不满足M变
2004-10-27 15:00:00
3154
原创 Cube Mapping
注:在网上有一篇关于Cube Mapping的不可多得的好资料,深刻理解这篇文章后对Cube Mapping相关知识可以说有了一定的了解,具体地址是:http://developer.nvidia.com/object/cube_map_ogl_tutorial.html。一开始我并不觉得这篇文章又多好(可是是当时读的时候很多东西不懂的缘故),第二次读的时候发现写的真的很好。下面就根据这篇文章,谈
2004-10-21 15:25:00
3746
原创 OpenGL之自动纹理坐标生成
OpenGL中有两种方法为顶点(Vertex)指定纹理坐标:1.由人工给每个顶点分配坐标。可以通过函数glTexCord*()来完成。2.由OpenGL自动为每个顶点分配坐标。这个任务由函数glTexGen*()来完成。一开始,我对glTexGen*()这个函数并不是十分的理解,不知道OpenGL到底是怎样自动生成纹理坐标的。查阅了相关的资料,才开始有一点明白:要完成自动纹理坐标的生成,首先要指定
2004-10-21 11:24:00
9096
1
原创 个人简历
个人简历姓 名:董士崇性 别:男出生年月:1979年2月手 机:13501962026宅 机:021-54284415电子邮件:shichongdong80@gmail.com网络日志:http://blog.csdn.net/houdy求职意向:高级软件工程师个人特长 * 能够熟练使用C/C++进行编码,能够运用OO思想在日常的开发工作中 * 熟悉Window开发环境,熟
2004-10-20 13:09:00
2805
原创 OpenGL之资料篇
这里收集的都是我收集的一些专题文章,并分门别类加以整理,供日后查询用.一.Shadering(渲染)1.Title:"Phong For Dummies" Addre:http://www.delphi3d.net/articles/viewarticle.php?article=phong.htm Abstraction: Phongs model is one of the most c
2004-10-13 13:27:00
2539
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人