
C++
文章平均质量分 70
vbvan
这个作者很懒,什么都没留下…
展开
-
Trip Report: June 2008 ISO C++ Standards Meeting
原文:http://herbsutter.wordpress.com/2008/07/04/trip-report-june-2008-iso-c-standards-meeting/ The ISO C++ committee met in Sophia Antipolis, France on June 6-14. You can find the minutes here (n转载 2008-07-25 09:08:00 · 3370 阅读 · 0 评论 -
程序分析实例 - 无双大蛇(Orochi)
下面以对KOEI的无双大蛇的一个bug的研究为例,介绍程序分析的基本方法。无双大蛇是KOEI公司推出的一款动作类游戏,3.20日发布了日文PC版。在游戏过程中发现,进入某些战斗的时候程序会陷入死循环,具体表现是在菜单中选择战斗场景之后,画面变黑,但是一直不出现战前配置的界面。Alt+F4关闭主窗口之后,还可以在任务管理器中找到它的进程。因为是进入战斗场景时发生的问题,猜测可能是读取或者解析场景原创 2008-03-26 10:08:00 · 6712 阅读 · 4 评论 -
VC Team Blog - TR1实现问答
原文:Q&A on our TR1 implementation大家好,我是Stephan,Visual C++库函数组的程序员。Visual Studio 2008扩展功能库的beta版已经发布(可以在这里下载,文档在这里),其中包含了TR1的实现,我想在这里回答一些关于TR1的问题 Q. 扩展功能库是针对哪个Visual C++版本的?A. 扩展功能库是针对Visual C++ 2008的RT翻译 2008-01-14 16:28:00 · 5310 阅读 · 4 评论 -
读C++标准系列 - 5.6~5.15 双目运算符(指针运算)
返回目录5.7 + -对于涉及指针的算术运算,标准中有比较严格的限制条件:参与运算的指针必须指向数组对象中的元素,或者指向数组对象最后一个元素的下一个元素(这是STL中能够使用distance(v.begin(),v.end())计算元素个数的前提条件)。(注:对于指向普通对象的指针,可以将该对象当成长度为1的数组中的元素)(5.7-4)否则,会导致未定义的行为。指针加减一个整型类型,相当于对指针原创 2007-12-18 15:11:00 · 3819 阅读 · 0 评论 -
C++ Internals: 序言
要深入了解一门语言,必须同时了解其内部机理,这样才能合理高效的使用它。本系列文章旨在介绍C++各种特性是如何实现的。VC RTTI C++ Internals: VC RTTI - 基本数据结构 C++ Internals: VC RTTI - typeidC++ Internals: VC RTTI - dynamic_cast (1) C++ Internals: VC RTTI - dyn原创 2007-12-16 13:21:00 · 4333 阅读 · 0 评论 -
C++ Internals: VC RTTI - dynamic_cast (2)
返回目录下面进入正题,让我们见识一下dynamic_cast到底是如何实现的。首先,在你调用dynamic_cast之前,编译器会帮你进行语法检查。如果指针的静态类型和目标类型相同,那么就什么事情都不做。否则,首先对指针进行调整,使得它指向vftable,并将其和调整之后的指针、调整的偏移量、静态类型以及目标类型传递给内部的__RTDynamicCast函数。其中最后一个参数指明转换的是指针还是引原创 2007-12-09 17:12:00 · 4878 阅读 · 0 评论 -
C++ Internals: VC RTTI - dynamic_cast (1)
返回目录相对而言,dynamic_cast的实现比较复杂,因此我们首先看一下它的简化版本dynamic_castvoid *>。根据标准5.2.7-7,dynamic_castvoid *>会将当前指针转化为指向实际对象(most derived object)的指针。比如说: class T1 {public: virtual ~T1() {}}; class T2 {public: vir原创 2007-11-30 13:28:00 · 3940 阅读 · 0 评论 -
C++ Internals: VC RTTI - typeid
返回目录在研究过VC的RTTI的基本结构之后,我们先来看看最简单的typeid是怎么实现的。在VC中,当你对多态类的指针ptr使用typeid(*ptr)之后,编译器会做两件事情:首先是将指针进行调整,使它指向当前类的vftable处(注意,类的vftable未必处在类的开始),然后再调用__RTtypeid,返回type_info对象。我们可以试验一下下面的代码。 templatetypenam原创 2007-11-29 21:54:00 · 4852 阅读 · 0 评论 -
C++ Internals: VC RTTI - 基本数据结构
返回目录网上资料比较少,ms还是有研究的价值 ^_^相关资源:Reversing Microsoft Visual C++ Part II: Classes, Methods and RTTIReversing C++C++的RTTI一旦遇上了多重和虚继承,简直就是噩梦 -.-这里介绍一下VC中用来表示RTTI的内部数据结构(具体可以参考《Reversing C++》里的描述)。利用下面的程序可以原创 2007-11-29 19:41:00 · 5276 阅读 · 1 评论 -
C++界面库 - Xtreme Toolkit Pro
一套扩展MFC的界面库,可以很方便的实现各种界面风格。不过话说VC2008的MFC即将集成它竞争对手的产品BCGControl,呵呵 官方网站:http://www.codejock.com/products/toolkitpro 最新的11.20版本已经支持VC2008了,所以编译没有太大的问题。要注意的一点是,源文件的注释有一些非GBK字符,编译的时候命令行里最好加上/wd4819 使用原创 2007-11-23 13:20:00 · 17785 阅读 · 8 评论 -
Win98 is gone
Win98早已被MS抛弃,不过至少VC2005编译的程序仍然可以在98下运行。但是如今, 随着2008的发布,Win98终于完全被无视,悼念一下。VC2005的时候,虽然官方没有提供对Win98的正式支持,但是ANSI方式编译的程序仍然可以正常运行。对于使用Unicode方式编译的程序,相对而言麻烦一些。因为Win98本身对Unicode的支持很差,所以要借助Microsoft Unicode L原创 2007-11-23 11:22:00 · 3288 阅读 · 0 评论 -
精确测量代码的CPU运行周期
工欲善其事,必先利其器。为了优化代码,我们需要准确的获取代码在运行期间的相关数据,比如最重要的运行时间。这里介绍若干种测量方法。目前有不少商业软件可以完成类似的测试,比如Intel VTune,AMD CodeAnalyst等等。VS2005的Professional版本中也有相应的Profiling功能。不过,对于轻量级的代码优化而言,杀鸡未必要用牛刀。首先,对于简单的计时需求,可以使用boos原创 2007-11-17 16:39:00 · 4048 阅读 · 0 评论 -
读C++标准系列 - 8.3.6 缺省参数
返回目录缺省参数不能出现在函数指针、函数引用以及typedef中(8.3-3)缺省参数可以在不同的声明中逐步给出(8.3-4)不同作用域的声明中定义的缺省参数是独立的,互不影响;同一作用域的声明中不能重复定义同一个参数的缺省值。看个例子就明白了: void f(int, int); void f(int, int = 7); void f(int = 7, int); //这句如果提到上一句前面就原创 2007-11-07 22:39:00 · 1567 阅读 · 1 评论 -
Prefer Compiler Error to Runtime Error - taking advantage of the syntax check flag
写代码难免会有bug,所以我们会写很多Test来确保我们的代码能够正常工作。但是为什么不从源头上避免bug的发生呢?Compiler可以帮助我们探测到很多潜在的bug,我们所要做的只是合理的设置编译参数、并充分利用C++的各种特性。通常我们可以利用编译器提供的Syntax Check功能来检测代码,这样可以避免生成大量临时的obj文件。下面是用于代码检测的推荐编译参数。VC8:命令行参数/Zc:f原创 2007-11-07 18:13:00 · 1290 阅读 · 0 评论 -
C++好书推荐
排名不分先后 :-)Effective C++ 作者:Scott MeyersISBN:0321334876 本人的C++启蒙读物,不过当时只有电子书,看完花了不少时间。如果是纸质书的话,估计几天也就看完了^_^More Effective C++ 作者:Scott MeyersISBN:020163371X Effective C++的姊妹篇,同样看的是电子书,hohoE原创 2007-11-07 16:24:00 · 5024 阅读 · 3 评论 -
在CSDN博客发表带语法高亮C++代码的小技巧
虽然CSDN的Blog有“插入代码”的功能,但是不支持C++。CSDN的编辑器使用了开源的FCKEditor。虽然它支持从Word中粘贴带格式的文本,但是从其它地方则不行。比如直接从VS2005拷贝,就无法正确识别格式。但是从Word拷贝有一个问题 ,代码的行间距会变得特别大。经过研究之后,发现了解决方法。(要从VS中拷贝语法高亮的代码可以使用我写的小工具CSDN Blogger)没仔细研究过CS原创 2007-11-05 00:16:00 · 3494 阅读 · 2 评论 -
读C++标准系列 - 5.6~5.15 双目运算符(算术运算)
返回目录首先,双目运算符在运算之前,会对操作数进行类型提升,以使两者的类型相同。同时,该类型也将会是最后结果的类型(5-10)1、如果任何一个操作数是long double、double或者float,那么两者都会提升到该类型2、否则,会对操作数进行integral promotion,在此之后3、如果两者都是有符号或者无符号,以rank大的类型为准。否则4、如果无符号类型的rank大于等于有符号原创 2007-11-03 21:03:00 · 3287 阅读 · 1 评论 -
读C++标准系列 - 2.13 Literals
返回目录C++支持以下5种类型的常数: 整型常数 字符常数 浮点常数 字符串常数 布尔常数1、整型常数(注:因为long long是C++0X才正式加入的,所以目前不同的编译器对它的支持和标准的描述还有些出入)有三类整型常数:十进制,以1~9开头八进制,以0开头十六进制,以0x或者0X开头你可以在整型常数后面加上后缀来明确它的类型(2.原创 2007-11-01 13:50:00 · 2166 阅读 · 0 评论 -
读C++标准系列 - 序言
闲暇之余读读C++的标准也是一件很有意思的事情, 我们可以在C++标准委员会的官方网站(http://www.open-std.org/jtc1/sc22/wg21/)下载C++0X标准的草案。目前最新的版本是2008.6.27发布的n2691.pdfISO/IEC 14882: Programming Language C++ - draft ISO/IEC TR 19768: C+原创 2007-11-01 13:43:00 · 2357 阅读 · 0 评论 -
Protected or Private?
作为父类的设计者,你可能会踌躇到底应该使用protected还是private来描述你的成员。那么,让我们来看看下面几个Sample吧:1、不相关的类访问protected成员 void B::yourfun(A &a) { class ASpe:public A { friend class B; }; static_cast(a).Protect原创 2007-10-31 11:10:00 · 1228 阅读 · 0 评论 -
Flexible C++
C++是一门非常灵活的语言,只要充分发挥你的想象, 再普通的东西都能玩出新花样1、1~1000求和循环?递归?再简单不过的题目了。但是如果不允许你用判断语句呢?如果你熟悉switch的内部实现,那么你很容易想到使用函数指针数组。 #include typedef int (*fun)(int); int f1(int i) {return 0;} int f2(int i) {fun f[2原创 2007-10-30 16:00:00 · 1722 阅读 · 0 评论 -
Self Print in C++
所谓的Self Print(自打印程序),就是指代码编译之后运行输出的结果和原来的代码一样。换言之,假设把编译-运行-输出作为一个算子F,代码作为自变量s的话,Self Print 就是要寻找s,使得 F(s)=s下面的程序要实现的是另外一种形式的Self Print,F(F(F(F(s))))=s #include int main() { int Type=0; char原创 2007-10-30 14:58:00 · 1272 阅读 · 0 评论 -
按拼音或者笔画排序你的字符串
很多人会很好奇,怎么数据库能够根据拼音排序的?网上能搜到很多网友自己写的处理按拼音排序的模块。GB2312的一级汉字确实是按拼音排列的,我们可以简单的比较它们的编码,但是二级汉字呢?如果你的程序是使用Unicode字符串的呢?不用担心,Windows I18N API已经给我们提供了相关的函数来实现这一切,你所需要做的就是传入一个合适的参数。下面的函数会将GBK中所有的汉字按拼音或者笔画序输出到原创 2007-10-30 14:35:00 · 1529 阅读 · 0 评论 -
搞挂你的C++编译器
Play with the compiler是一件很有趣的事情,编译死循环的程序便是其中之一。让我们和编译器一起做游戏吧~1、Preprocessa、Self Include(GCC only)一般的编译器都有include嵌套层数的限制,所以你需要在适当的时候停止嵌套。利用GCC提供的__INCLUDE_LEVEL__可以很轻松的实现这一点。时间复杂度是na,n是每层的Self Include原创 2007-10-30 13:03:00 · 5878 阅读 · 7 评论 -
C++编译器错误信息的Trick
做在线OJ的时候往往不能看到程序的运行输出,但我们仍然可以从编译器提供的错误信息中得到不少有价值的信息。比如说编译器的类型、版本以及使用的库等等。同样,当我们没有本地编译器的时候,也可以利用这些技巧+在线编译器(比如http://www.dinkumware.com/exam/default.aspx)获得我们感兴趣的信息(比如结构对齐信息,复杂对象类型等等)1、输出宏的内容基本的思想就是利用C+原创 2007-10-30 11:04:00 · 1148 阅读 · 0 评论