编程瘦Windows C ++程序(如uTorrent)

我一直很欣赏原来的uTorrent程序。 它看起来不错,小于64kb,速度非常快,并具有我需要的所有function。 不幸的是,这个程序是封闭的源代码(并且变得更加臃肿),所以我来到Stackoverflow寻求灵感。

你推荐什么方法在Windows上编写快速,高效,高效的程序?

虽然C#(和整个.NET概念)是很酷的想法,但我更喜欢“纯粹”的答案,以及为Windows平台编写高效,快速的软件的挑战,就像原来的uTorrent客户端一样。 我不介意分配我自己的内存,做我自己的垃圾收集和创build我自己的数据结构。

书籍,文章,图书馆,IDEs(甚至有效的方式,让更多的咖啡因进入我的系统)的build议值得欢迎。

Windows模板库面向你想要做的事情。 这是一个轻量级的,基于模板的Win32 API的C ++包装器。 有了它,你不必经历直接的Win32编码的痛苦,但它不会像MFC一样添加很多开销。

uTorrent是用C ++编写的,使用老式的Win32 API。 Google Chrome也是这样编写的,那么为什么不下载源代码并从他们的代码中学习呢?

如果你想优化尽可能小的内存空间,你不介意.NET CLR被发明出来为你照顾,那么编写一个直接的Win32API应用程序,并钩到GDI +的方式是去。 Petzold是权威的参考。

实际上,这是一个愚蠢的错误,因为.NET运行时将被加载到操作系统的内存中,不pipe你的应用程序是否使用它,所以你也可以链接到它。

演示场景是一群花费空余时间试图制作令人印象深刻且非常小的可执行文件的人,这些可执行文件通常以3d渲染音乐。 整个演示(代码,音乐,3D数据)经常被编译成一个单一的可执行文件,压缩到64K或者内容的尺寸非常小。

您可以从演示中获得一些灵感,并了解它们是如何制作的,这将会让您着迷于创build小型可执行文件。

通常,关键是要利用与Windows一起安装的尽可能多的第三方DLL。 此外,还需要低层次的自定义编码。

一般:对于较小的可执行文件,#define WIN32_LEAN_AND_MEAN和VC_EXTRALEAN(假设VS)。 不要用debugging符号编译(你可能知道这一点)。 使用更less的库,并成为用户链接你需要的库的部分(VC的链接器是相当不错的,但不要触摸optlink,如果你可以帮助它)。

剥离重定位标题:转到http://www.paehl.de/cms/oldtools并search“ReduceEXE”(直接下载链接:; http : //www.paehl.de/reduce.zip )。

运行一个可执行的打包程序: http : //upx.sourceforge.net/ …它在运行时使用了更多的内存,启动速度稍慢,但是文件更小。

如果你关心的文件大小超过速度,VC有一个“优化大小”的选项,closures一些东西,如循环展开和functioninling。

如果你想去核心(而不关心所有的软件工程优势),尝试使用更less的类,而不是虚拟function的POStypes。 维基百科build议,一个程序的执行时间的6-13%用于虚拟呼叫。 另外,vtables本身占用(一个LITTLE)内存,并且在每个类实例(具有虚拟函数)的开始处将size_t值分配给vtable指针。 IOW,“纯粹的C”可能会稍微快一点(尽pipe如果你发现自己用函数指针模拟类,回到C ++)。

旧的“LIBCTiny”技巧仍然有效。 使用现代的VC ++版本,您可能需要closures一些function。

另一个好的技巧是知道Kernel32中的lstr*函数集合。 这已经在记忆中,所以这些function可能是一个更精简的select。

记事本+ +也是一个非常快速,高度优化和非常有用的操作系统程序,可以激发你的灵感。 它的哲学与uTorrent相似。 它使用的是旧的Win32 API,它应该仍然是Windows上最快的。

如果你想去真正的艺术,演示场景是一个完美的地方。 虽然他们的代码并不总是开放的。