07 2011 档案

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

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

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

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

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

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

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

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

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

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

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

posted @ 2011-07-31 12:49 xuangong 阅读(1001) 评论(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 阅读(442) 评论(0) 推荐(0)

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

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

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

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

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

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

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

posted @ 2011-07-31 12:09 xuangong 阅读(271) 评论(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 阅读(366) 评论(0) 推荐(2)

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

posted @ 2011-07-31 08:51 xuangong 阅读(185) 评论(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 阅读(420) 评论(0) 推荐(0)

C++虚函数表解析(转)
摘要:C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现机制上面为大家 一个清晰的剖析。当然,相同的文章在网上也出现过一些了,但我总感觉这些文章不是很容易阅读,大段大段的代码,没有图片,. 阅读全文

posted @ 2011-07-30 20:23 xuangong 阅读(204) 评论(0) 推荐(0)

VC++中为何在每个CPP文件中必须要加入StdAfx.h头文件
摘要:首先,与StdAfx.h对应的还有一个StdAfx.cpp文件,他们的目的是一次编译,生成一个projectname.pch这样的一个预编译头文件,将其用于工程中所有的cpp文件,这样的话,如果工程中的某个cpp文件需要引用头文件的话,则只需要去引用预编译pch文件即可,无需引入头文件,从而避免了重新编译头文件的麻烦,由于MFC系统的头文件比较巨大,如果每个CPP都重新编译一遍头文件,将浪费过多的编译时间,故这种做法能大大加快编译速度。其次,这就要求每个CPP如果要使用预编译头文件projectname.pch加快编译速度的话,VC默认的方式是通过在文件的中加入StdAfx.h的方法来告知编. 阅读全文

posted @ 2011-07-30 19:57 xuangong 阅读(797) 评论(0) 推荐(0)

c与c++程序连接问题 (转)
摘要:它们之间的连接问题主要是因为c\c++编绎器对函数名译码的方式不能所引起的,考虑下面两个函数/* c*/int strlen(char* string){ ... }//c++int strlen(char* string){ ... }两个函数完全一样。在c在函数是通过函数名来识别的,而在C++中,由于存在函数的重载问题,函数的识别方式通函数名,函数的返回类型,函数参数列表三者组合来完成的。因此上面两个相同的函数,经过C,C++编绎后会产生完全不同的名字。所以,如果把一个用c编绎器编绎的目标代码和一个用C++编绎器编绎的目标代码进行连接,就会出现连接失败的错误。解决的方法是使用extern 阅读全文

posted @ 2011-07-30 19:53 xuangong 阅读(639) 评论(0) 推荐(0)

定制Vim for C++
摘要:弄了台二手电脑改装下装上centos,当成公共的服务器使用,我就开始折腾Vim了,从网上找找资料动手干。世界上的程序员分三种,一种是用Emacs,一种是用Vim的,其它的归为第 三种。在编写C/C++的程序时,只用Vim自身的功能还是不太爽的, 还需要其它的插件,将其构造成一个比VC爽得多的IDE。由于每个工具介绍清楚都不是一两句话说得完的,以下只列出插件的名称,具体的内容google之 即可。其中vim插件可以到VIMer最常去的www.vim.org下载。安装Vim/非Vim插件Ctags,非vim插件。Ctags是Vim必不可少的工具,它可以将C/C++的宏、变量、函数、类等一系列信息. 阅读全文

posted @ 2011-07-30 15:42 xuangong 阅读(1547) 评论(0) 推荐(0)

VIM入门必读(转)
摘要:——整理自互联网Vi IMproved (VIM) 是 Bram Moolenaar 开发的与 UNIX 下的通用文本编辑器 vi 兼容并且更加强大的文本编辑器。它支持语法变色、正规表达式匹配与替换、插入补全、自定义键等等功能,为编辑文本尤其是编写程序提供了极大方便。VIM 可以运行在“任何”操作系统上,包括我们常用的 Windows 和 UNIX/Linux。一旦掌握了 VIM,你就掌握了一项跨平台的利器。尽管 VIM 功能十分强大,但对于刚接触它的人尤其是用惯类似 Windows 的 notepad 的人来说,VIM 并不十分易于掌握,毕竟它兼容的是 vi 而不是 notepad。本文旨. 阅读全文

posted @ 2011-07-30 15:26 xuangong 阅读(3534) 评论(0) 推荐(1)

C/C++笔试题 (三)【转】
摘要:1、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。.#define Min(X, Y) ((X)>(Y)?(Y):(X))//结尾没有;2、嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。while(1){}或者for(;;)3、关键字static的作用是什么?定义静态变量4、关键字const有什么含意?表示常量不可以修改的变量。5、关键字volatile有什么含意?并举出三个不同的例子?提示编译器对象的值可能在编译器未监测到的情况下改变。int (*s[10])(int) 表示的是什么啊int (*s[10])(int) 函数指针数组,每个指针指向一个int func(i 阅读全文

posted @ 2011-07-29 23:01 xuangong 阅读(512) 评论(0) 推荐(0)

C/C++笔试题 (二)【转】
摘要:12 . 下面的代码输出是什么,为什么?void foo(void){ unsigned int a = 6; int b = -20; (a+b > 6) ? puts("> 6") : puts("<= 6");}这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是 ">6"。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当 阅读全文

posted @ 2011-07-29 22:59 xuangong 阅读(456) 评论(0) 推荐(0)

C/C++笔试题 (一)【转】
摘要:1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用2.引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。3.描述实时系统的基本特性 在特定时间内完成特定 阅读全文

posted @ 2011-07-29 22:56 xuangong 阅读(247) 评论(0) 推荐(0)

学习C/C++的经验谈(转)
摘要:今日看到这篇文章,感觉不错,比较有启发意义。 工作已经有三年半,算上学校里的时间,大约已有7年的C语言和5年的C++使用经验;熟练使用C/C++也有3年以上;现在的我自认为是可以称得上精通C/C++,基本现在市面上广泛被推崇的经典书籍,如:《C++ Primer》、《高级C++编程技术》、《STL原码剖析》、《Effective C++》、《C编程陷阱》、《Thinking in C++》等等,这些书只有《高级C++编程技术》和《C编程陷阱》在早些时候是通篇看完的(也是因为它们都比较薄),其它的现在基本上都已经不能启发我了,这些书虽然内容各不相同,但针对的读者水平是一样的,应该是已经学会编程. 阅读全文

posted @ 2011-07-29 22:44 xuangong 阅读(425) 评论(0) 推荐(0)

C语言 printf格式控制符 完全解析
摘要:printf的格式控制的完整格式:% - 0 m.n l或h 格式字符下面对组成格式说明的各项加以说明:①%:表示格式说明的起始符号,不可缺少。②-:有-表示左对齐输出,如省略表示右对齐输出。③0:有0表示指定空位填0,如省略表示指定空位不填。④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。---------------------------------------格式字符格式字符用以指定输出项的数据类型和输 阅读全文

posted @ 2011-07-29 22:36 xuangong 阅读(7858) 评论(0) 推荐(0)

C++内存管理详解(转)
摘要:这篇文章实际上还是不错的,不过我更建议大家看Exceptional c++,上面有部分专门讲这个的。而且这篇文章中说内存分配的方式有三种,是不准确的。malloc分配的位于堆上,而new的被称为自由储存区。两者不可混用,比如说malloc的内存绝对不能用delete来释放。 因此建议大家看EPC ,不过这篇文章有些东西还是可以了解下的,不能一棍子把人打死了。 程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。 1、内存分配方式 内存分配方式有三种. 阅读全文

posted @ 2011-07-29 22:27 xuangong 阅读(344) 评论(0) 推荐(0)

让我们习惯在底层用C++宏生成代码 (转)
摘要:我们知道使用C++泛型编程可以写出扩展性非常强的程序,使用C++的接口技术也可以很容易的扩展出已经存在的程序。只不过有一件事情它们可都做不到,那就是使用宏来产生代码。使用宏来生成代码通常对于库作者和底层架构者具有非凡的意义,而在应用层个人认为应该尽量减少它的使用,当然,这并不影响我们去学习并了解它。 那么什么叫“使用宏来产生代码”呢? 首先我提出如下的需求:我现在需要一个函数JoinString,它能接受1到20个不等的参数,并将每一个参数转换成字符串,最后在函数内部把这些字符串拼接起来然后作为一个字符串返回。类似于这样:stringJoinString( 参数列表... ) { 转换 返回参 阅读全文

posted @ 2011-07-29 11:22 xuangong 阅读(1667) 评论(1) 推荐(1)

【转】 Source Insight设置
摘要:转载自chenjun_dzlt1、背景色选择 要改变背景色Options->preference->windows background->color设置背景色2、解决字符等宽对齐问题。 SIS默认字体是VERDANA,很漂亮。这网页上应该也是用的VERDANA字体。但由于美观的缘故,VERDANA字体是不等宽的。比如下面两行 llllllllll MMMMMMMMMM 同样10个字符,长度差多了.用VERDANA来看程序,有些本应该对齐的就歪了。解放方法是使用等宽的字体,但肯定比较丑。比较推荐的是用Courier New。3、解决TAB键缩进问题 Options-> 阅读全文

posted @ 2011-07-29 10:44 xuangong 阅读(11534) 评论(2) 推荐(0)

[C++语法] 关键字typedef用法(转)
摘要:C/C++语言中的typedef相信大家已经不陌生,本文对C/C++语言关键字typedef的各种用法作一个介绍。typedef,顾名思义,为“类型定义”,可以解释为:将一种数据类型定义为某一个标识符,在程序中使用该标识符来实现相应数据类型变量的定义。例如:typedefunsignedintUINT;intmain (intargc,char*argv[]){unsignedinta;// it’s OKUINT b;// it’s OK, a and b are of the same type (int)// . . .// code references the symbol a an 阅读全文

posted @ 2011-07-28 19:56 xuangong 阅读(233) 评论(0) 推荐(0)

成员函数指针与高性能的C++委托(转)
摘要:成员函数指针与高性能的C++委托Member Function Pointers and the Fastest Possible C++ Delegates撰文:Don Clugston翻译:周翔引子标准C++中没有真正的面向对象的函数指针。这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值。在Delphi (Object Pascal)中,面向对象的函数指针是Borland可视化组建库(VCL,Visual Component Library)的基础。而在目前,C#使“委托”的概念日趋流行,这也 阅读全文

posted @ 2011-07-28 19:54 xuangong 阅读(616) 评论(0) 推荐(1)

导航