2011年7月31日

C内存字节对齐详解(转)

摘要: 原文地址:http://hi.baidu.com/jjpro/blog/item/06ea380859eac433e82488f8.html一、什么是对齐,以及为什么要对齐:1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。2. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况, 但是最常见的是如果不按 阅读全文

posted @ 2011-07-31 16:35 xuangong 阅读(425) 评论(0) 推荐(0) 编辑

【转】C++实用技巧(四)

摘要: 之前的文章讲了指针和内存的一些问题,今天说一下单元测试的问题。如果在团队里面没有对单元测试的框架有要求的话,其实我们可以使用一个最简单的方法来搭建在IDE里面运行的单元测试框架,整个框架只需十几行代码。我们先来考虑一下功能最少的单元测试框架需要完成什么样的内容。首先我们要运行一个一个的测试用例,其次在一个测试用例里面我们要检查一些条件是否成立。举个例子,我们写一个函数将两个字符串连接起来,一般来说要进行下面的测试:1#include"MyUnitTestFramework.h"//等一下我们会展示一下如何用最少的代码完成这个头文件的内容2#include"&quo 阅读全文

posted @ 2011-07-31 13:04 xuangong 阅读(179) 评论(0) 推荐(0) 编辑

【转】C++实用技巧(三)

摘要: 今天是关于内存的最后一篇了。上一篇文章讲了为什么不能对一个东西随便memset。里面的demo代码出了点小bug,不过我不喜欢在发文章的时候里面的demo代码也拿去编译和运行,所以大家有什么发现的问题就评论吧。这样也便于后来的人不会受到误导。这次说的仍然是构造函数和析构函数的事情,不过我们将通过亲手开发一个智能指针的方法,知道引用计数如何帮助管理资源,以及错误使用引用计数的情况。 首先先来看一下智能指针是如何帮助我们管理内存的。现在智能指针的实现非常多,我就假设这个类型叫Ptr<T>吧。这跟Vczh Library++ 3.0所使用的实现一样。1classBase2{3public 阅读全文

posted @ 2011-07-31 13:03 xuangong 阅读(202) 评论(0) 推荐(0) 编辑

【转】C++实用技巧(二)

摘要: 上一篇文章讲到了如何检查内存泄露。其实只要肯用C++的STL里面的高级功能的话,内存泄露是很容易避免的。我在开发Vczh Library++ 3.0的时候,所有的测试用例都保证跑完了没有内存泄露。但是很可惜有些C++团队不能使用异常,更甚者不允许写构造函数析构函数之类,前一个还好,后一个简直就是在用C。当然有这些变态规定的地方STL都是用不了的,所以我们更加需要扎实的基础来开发C++程序。 今天这一篇主要还是讲指针的问题。因为上一篇文章一笔带过,今天就来详细讲内存泄漏或者野指针发生的各种情况。当然我不可能一下子举出全部的例子,只能说一些常见的。一、错误覆盖内存。 之前提到的不能随便乱memse 阅读全文

posted @ 2011-07-31 13:00 xuangong 阅读(321) 评论(0) 推荐(0) 编辑

【转】C++实用技巧(一)

摘要: C++实谓各种语言中的软肋,功能强大,陷阱更强大。当然我认为一门语言用得不好完全是程序员的责任,不过因为C++涉及到的概念实在是太多,想用好实在也不是一件容易的事情。C++开发的时候总是会遇到各种各样的问题,其中最严重的无非是内存相关的。C语言由于结构简单,内存处理起来虽然不得力,但总的来说惯用法已经深入人心,因此也不会造成什么很难发现的错误。C++就不一样了。有了虚函数、构造函数、析构函数、复制构造函数和operator=重载之后,还是有很多人喜欢把一个类直接写进文件流,或者拿来memset,代码一团乱麻,不知悔改也。但是不能因此因噎废食,就像某人因为C++带来的心智问题太多,自己搞不定,. 阅读全文

posted @ 2011-07-31 12:57 xuangong 阅读(192) 评论(0) 推荐(0) 编辑

如何手写语法分析器(转)

摘要: 从网上无意间看到这个系列的文章,作者非常有想法,转下来慢慢研究,好好学习。 祝大家学习愉快,做自己的爱好 ^_^ !如何手写语法分析器陈梓瀚华南理工大学软件05级本科在写可配置的语法分析器之前,我觉得还是先说说如何手写语法分析器好。因为对于大部分人来说,开发一个可配置的语法分析器并没有什么作用,反而针对某种特定的语法开发特定的语法分析器是特别有必要的。典型的有表达式计算器、某种格式化的文件(HTML、XML等)或者是其他的复杂而且符合树型结构的字符串。根据目前论坛的反应来看,有一些朋友们对如何开发一套自己的脚本引擎比较感兴趣。等基础的文章都写完以后我会考虑撰写一个系列的文章介绍如何开发自己的脚 阅读全文

posted @ 2011-07-31 12:49 xuangong 阅读(981) 评论(0) 推荐(0) 编辑

【转】C++轻量级可配置语法分析器

摘要: Combinator_Parser这个分析器包含了四个文件: VL_Data_Basic.h(使用了其中的智能指针VL_AutoPtr和一些类型重命名) VL_CpData.h(数据结构) VL_CpKernel.h/cpp(词法分析器和语法分析器)以下是将一个四则运算式子的字符串进行词法分析,分割成记号之后求值的代码:1#include"..\..\..\..\VL++\Library\Platform\VL_Console.h"2#include"..\..\..\..\VL++\Library\Data\Grammar2\VL_CpKernel.h" 阅读全文

posted @ 2011-07-31 12:22 xuangong 阅读(415) 评论(0) 推荐(0) 编辑

【转】Vczh Library++3.0之可配置语法分析器(分析器内核)

摘要: 从网上无意间看到这个系列的文章,作者非常有想法,转下来慢慢研究,好好学习。 祝大家学习愉快,做自己的爱好 ^_^ !在上一篇文章中,我们已经实现了在C++中直接写文法并转换成文法树的工作,现在要开始实现三个组合文法了。 文法树的定义是递归的,所以我们的文法树在分析输入的时候也是递归的。每个文法树都由更小的文法树组成,因此每一个文法树在分析输入的时候都需要调用更小的文法树的分析过程。因为连接、分支和循环都很像,因此下面我的描述性文字会少一些。 下面是连接的代码:1template<typenameI,typenameO1,typenameO2>2class_Seq:publicCom 阅读全文

posted @ 2011-07-31 12:18 xuangong 阅读(233) 评论(0) 推荐(0) 编辑

【转】Vczh Library++ 3.0之可配置语法分析器(设计文法表达式)

摘要: 从网上无意间看到这个系列的文章,作者非常有想法,转下来慢慢研究,好好学习。 祝大家学习愉快,做自己的爱好 ^_^ ! 上一篇文章中我们看到了可配置语法分析器使用起来的样子,在这篇文章中我将告诉大家如何通过重载操作符的方法构造文法表达式树,从而使用递归向下法进行语法分析的工作。 在这之前我们将研究一下什么是文法表达式。我们将文法表达式看成分析器,于是复杂的文法表达式就是由简单的分析器通过各种方法组合起来的复杂分析器。一个分析器有以下几个属性: 1:输入类型。输入类型通常是一个字符串的指针还是迭代器什么的,具体类型不重要,重要的是输入状态必须能被复制,能跳到下一个元素。当然wchar_t*也满足这 阅读全文

posted @ 2011-07-31 12:16 xuangong 阅读(217) 评论(0) 推荐(0) 编辑

【转】Vczh Library++3.0之可配置语法分析器(分析Demo:函数式宏)

摘要: 从网上无意间看到这个系列的文章,作者非常有想法,转下来慢慢研究,好好学习。 祝大家学习愉快,做自己的爱好 ^_^ ! 上一篇文章提到了我开发了可配置语法分析器之后做了一个FpMacro用来生成C++有规律的代码。这一篇文章就从FpMacro入手,分析可配置语法分析器所需要具备的功能。首先让我们来了解一下什么是FpMacro。 FpMacro主要用来产生用C++宏很难容易产生的代码(譬如BOOST那个宏)。当你需要重复产生一些区别很小但是又不能用模板解决的代码的时候,用宏就不是一个好的选择,因为这种宏对于输入的东西都有很多限制。譬如说因为宏展开的顺序的问题,你把另一个宏当成高阶函数传进去,过不了 阅读全文

posted @ 2011-07-31 12:13 xuangong 阅读(318) 评论(0) 推荐(0) 编辑

【转】Vczh Library++3.0之可配置语法分析器(前言)

摘要: 从网上无意间看到这个系列的文章,作者非常有想法,转下来慢慢研究,好好学习。 祝大家学习愉快,做自己的爱好 ^_^ ! 花了差不多两个星期的时间将一个可配置语法分析器(Combinator)写好了。这个语法分析器被设计来完成以下任务: 1、易于使用,并且在运行时可更改 2、提供对分析字符串和容器的支持 3、可使用正则表达式辅助定义分析器 4、如果觉得预定义的设备不满意,用户可以自行提供新的文法元素(譬如说增加一种使用通配符进行语法分析的元素) 5、提供可配置错误恢复策略,提供合理的错误发生位置信息,用户可根据自己的意愿来决定错误信息的内容。 不过直接写这玩意儿怎么开发出来的比较枯燥,所以这里我准 阅读全文

posted @ 2011-07-31 12:09 xuangong 阅读(256) 评论(0) 推荐(0) 编辑

简述C和C++的学习历程(转)

摘要: ——by:肖舸老师总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复。一家之言,欢迎拍砖哈。1、可以考虑先学习C。大多数时候,我们学习语言的目的,不是为了成为一个语言专家,而是希望成为一个解决问题的专家。做一个有用的程序员,做一个赚钱的程序员。我们的价值,将体现在客户价值上,而不是语言写得好不好看。C++是C的一个面向对象的解释,C++为C扩充了大规模工程应用,复杂的系统结构的组织和掌控方法,但是,我认为,C++骨子里还是C的。毕竟,解决具体问题,每个函数内部,都是用C的方式写程序,还是面向过程的。因此,想要学习好C++,我的建议,先学习C,先学解决问题. 阅读全文

posted @ 2011-07-31 08:57 xuangong 阅读(353) 评论(0) 推荐(2) 编辑

一些比较重要的算法(转)

摘要: 下面是一些比较重要的算法,原文罗列了32个,但我觉得有很多是数论里的,和计算机的不相干,所以没有选取。下面的这些,有的我们经常在用,有的基本不用。有的很常见,有的很偏。不过了解一下也是好事。也欢迎你留下你觉得有意义的算法。(注:本篇文章并非翻译,其中的算法描述大部份摘自Wikipedia,因为维基百科描述的很专业了)A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。该算法像Dijkstra算法一样,可以找到一条最短路径;也像BFS一样,进行启发式的搜索。Beam Search束搜索(beam 阅读全文

posted @ 2011-07-31 08:51 xuangong 阅读(174) 评论(0) 推荐(0) 编辑

用汇编的思路理解VC++函数调用(转)

摘要: 空程序:int main(){00411360 push ebp ;压入ebp00411361 mov ebp,esp ;ebp = esp,保留esp,待函数调用完再恢复,因为函数调用中肯定会用到esp.00411363 sub esp,0C0h ;esp-=0C0h(192);为该函数留出临时存储区;将其他指针或寄存器中的值入栈,以便在函数中使用这些寄存器。00411369 push ebx ;压入ebx0041136A push esi ;压入esi0041136B push edi ;压入edi0041136C lea edi,[ebp-0C0h] ;读入[ebp-0C0h]有效地址, 阅读全文

posted @ 2011-07-31 08:35 xuangong 阅读(409) 评论(0) 推荐(0) 编辑

导航