WinxGui Official Blog

分类“tips”的存档

最快速度去Google.CN?

什么办法可以以最快速度去Google.CN?

排除收藏Google网站一途外,其实你只需要在地址栏输入 g.cn 即可。

评论

Windows程序调试系列: DIA SDK

Windows程序调试系列: 使用VC++生成调试信息介绍了各种调试信息文件。但是最具有实用意义的pdb格式不明,只能通过DIA(Debug Information Access) SDK来进行访问。

Microsoft Visual Studio 2005 直接带有DIA SDK,位于 $(VSROOT)\DIA SDK 下。其中这里 $(VSROOT) 指 Microsoft Visual Studio 2005 的根目录。从其提供的idl看,功能还是比较完整。另外,DIA SDK还提供一个Samples:DIA2Dump,该程序本身已经是一个较为实用的程序。

评论

出差北京

最近(4月5日 - 4月13日)出差北京,待的时间比较久,欢迎朋友骚扰:)

我的联系方式已经给过多次了,这里不妨再重复下:

  • GTalk/GMail - xushiweizh at gmail dot com
  • MSN - xswzh at hotmail dot com

另外,我近2年来的研究方向是: Distributed System, Parallel Computing, Search Engine, Collaborative Filtering, Text Processing, NLP, 欢迎交流。

评论 (1)

CN域名1元/年?

活动从今天开始,持续2个月。不过看了下条款,只允许注册1年,看起来是个促销活动。

有兴趣的朋友赶紧了。

评论

排序算法:qsort vs std::sort

你应该忘记C库的qsort,而使用C++的std::sort。尽管两者都是采用快速排序算法。

由于C++独特的模板技术,加上仿函数(functor)的存在,使得排序算法在C++语言中,获得了无可比拟的性能优势。这种优势是C语言,更别说其他如Java、C#语言所可以比拟的。虽然,Java、C#也存在模板,但是他们的模板技术实现方案无法带来性能上的好处。

评论 (2)

回调函数(callback)与仿函数(functor)

本文已经迁移到:http://cpp.winxgui.com/cn:functor 

回调函数(callback)与仿函数(functor)很多时候从用途上来看很相似,以致于我们经常将它们相提并论。例如:

inline bool compare(int a, int b)
{
return a > b;
}

struct comparer {
bool operator()(int a, int b) const {
return a > b;
}
};

void main()
{
std::vector
<int> vec, vec2;
std::sort(vec.begin(), vec.end(), compare);
std::sort(vec2.begin(), vec2.end(), comparer());
}

仿函数(functor)之所以称为仿函数,是因为这是一种利用某些类对象支持operator()的特性,来达到模拟函数调用效果的技术。

如果这里vec, vec2这两个vector的内容一样,那么从执行结果看,使用回调函数compare与使用仿函数comparer是一样的。

那么,我们应该用回调,还是用仿函数?

很多人都说用仿函数吧,回调函数是丑陋的,代码不太象C++风格。

但其实问题的本质不是在代码风格上,仿函数与回调函数各有利弊,不能一概而论。

仿函数(functor)的优点

我的建议是,如果可以用仿函数实现,那么你应该用仿函数,而不要用回调。原因在于:

  • 仿函数可以不带痕迹地传递上下文参数。而回调技术通常使用一个额外的void*参数传递。这也是多数人认为回调技术丑陋的原因。
  • 更好的性能。

仿函数技术可以获得更好的性能,这点直观来讲比较难以理解。你可能说,回调函数申明为inline了,怎么会性能比仿函数差?我们这里来分析下。我们假设某个函数func(例如上面的std::sort)调用中传递了一个回调函数(如上面的compare),那么可以分为两种情况:

  • func是内联函数,并且比较简单,func调用最终被展开了,那么其中对回调函数的调用也成为一普通函数调用(而不是通过函数指针的间接调用),并且如果这个回调函数如果简单,那么也可能同时被展开。在这种情形下,回调函数与仿函数性能相同。
  • func是非内联函数,或者比较复杂而无法展开(例如上面的std::sort,我们知道它是快速排序,函数因为存在递归而无法展开)。此时回调函数作为一个函数指针传入,其代码亦无法展开。而仿函数则不同。虽然func本身复杂不能展开,但是func函数中对仿函数的调用是编译器编译期间就可以确定并进行inline展开的。因此在这种情形下,仿函数比之于回调函数,有着更好的性能。并且,这种性能优势有时是一种无可比拟的优势(对于std::sort就是如此,因为元素比较的次数非常巨大,是否可以进行内联展开导致了一种雪崩效应)。

仿函数(functor)不能做的?

话又说回来了,仿函数并不能完全取代回调函数所有的应用场合。例如,我在std::AutoFreeAlloc中使用了回调函数,而不是仿函数,这是因为AutoFreeAlloc要容纳异质的析构函数,而不是只支持某一种类的析构。这和模板(template)不能在同一个容器中支持异质类型,是一个道理。

评论 (1)

WINX AppWizard使用指南

winx-1.1.08版本发布了。此次更新的内容较多。您可以到这里了解详情。最引人注目的当然是WINX也提供了Application Wizard了,你可以很方便地开始建立自己的WINX应用程序。以下是WINX AppWizard的一个简单使用指南。  

安装

  1. 下载winx-1.1.08.zip解压到winx-1.1.08目录。
  2. 进入winx-1.1.08\winx目录,你可以发现一个名为install.bat的文件,双击执行它。
  3. 还要下一步吗?没有了。

使用

  1. 打开Visual C++ 6.0,新建一个Project,此事出现以下对话框:
     
     
  2. 请注意新工程的所在的位置(注意上图的”Location:”字样)。WINX的AppWizard假设你的工程和WINX在同一个目录树下。如果不按照这个要求,将出现以下错误对话框:

     
  3. 点下一步,进入这个界面:

     
  4. 后面总体来说比较傻瓜式,就不罗唆了。有一点需要注意:如果你没有下载winsdk.zip,请进入”Advance…”对话框,把其中Enable all features of Windows选项去掉。如图:

     
  5. 上面的Advance对话框中,我的名字和Email请替换为自己的。

意外

如果你下载了winsdk.zip,并且使用了它,有时你可能遇到以下Link错误:uuid.lib文件破坏。

这是我提供的winsdk有些lib文件破坏了,临时的解决方案是,拿VC++ 6.0带的uuid.lib替换掉winsdk/lib/uuid.lib 即可。

评论

一个伟大的细节发现

汗,原来MsgBox中的文本可以Ctrl+C进行Copy(以前只知道计算器中的文本是可以Copy&Paste的),真是大开眼界了。可怜我以前都是拿个NodePad去抄写哩。这个伟大的发现来自“珠穆朗玛”,又名“老汉”。

评论 (1)