为Windows编写纤薄的C++程序(如uTorrent)

And*_*oid 40 c++ windows

我一直很欣赏原来的uTorrent程序.它看起来很棒,不到64kb,非常快,并且拥有我需要的所有功能.不幸的是,该程序是封闭源程序(并且当天变得更加臃肿)所以我来到Stackoverflow获取灵感.

在Windows上编写快速,内存高效且优雅的程序时,您建议使用哪些方法?

虽然C#(以及整个.NET概念)都是很酷的想法,但我更感兴趣的是"纯粹主义"的答案以及为Windows平台编写高效,快速软件的挑战,就像最初的uTorrent客户端一样.我不介意分配自己的内存,做我自己的垃圾收集和创建自己的数据结构.

关于书籍,文章,图书馆,IDE的建议(甚至是将更多咖啡因纳入我的系统的有效方法)也受到欢迎.

Eri*_*ric 17

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


Sta*_*ked 10

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


Cra*_*rks 8

如果你想针对尽可能小的内存占用进行优化,并且你不介意跳过.NET CLR发明的一堆箍来为你照顾,那么编写一个直接的Win32API应用程序并挂钩到GDI +是这样的去.Petzold是最终的参考.

但实际上,这是一个傻瓜的差事,因为无论你的应用程序是否使用它,.NET运行时都会加载到操作系统的内存中,所以你也可以链接到它.

  • @Pontus Gagge:您的理解不正确.从Windows 3.x时代开始,DLL的整个想法就是避免将相同的代码多次加载到内存中.Win16和Win32都在进程之间共享DLL代码(尽管通过不同的机制).DLL通过虚拟内存的魔力出现在每个进程地址空间中,但实际上在内存中只有一个DLL代码实例. (8认同)

Tom*_*eys 7

演示场景是一组谁花自己的空闲时间试图让令人印象深刻和非常小的可执行文件,通常呈现东西在3D的音乐人.整个演示(代码,音乐,三维数据)通常会编译成一个压缩到64k的单个可执行文件,或者内容的尺寸非常小.

您可以从演示中获得一些灵感,并了解它们是如何制作的,这将告诉您创建小型可执行文件的过程.

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


Rob*_*ser 5

常规:对于较小的可执行文件,#define WIN32_LEAN_AND_MEAN和VC_EXTRALEAN(假设为VS).不要使用调试符号进行编译(您可能知道这一点).使用更少的库,用户只需链接您需要的库部分(VC的链接器非常好用,但如果可以帮助它,请不要触摸optlink).

剥离重定位标头:转到http://www.paehl.de/cms/oldtools并搜索"ReduceEXE"(直接下载链接:http://www.paehl.de/reduce.zip).

运行一个可执行的打包程序:http://upx.sourceforge.net/ ...它在运行时耗尽了更多的内存并开始慢一点,但文件要小得多.

如果您关心文件大小超过速度,VC可以选择"优化大小",​​这会关闭循环展开和函数inling等功能.

如果你想去硬核(并不关心所有的软件工程优势),尝试使用更少的类,而不是更喜欢没有虚函数的POS类型.维基百科建议,程序执行时间的6-13%用于虚拟呼叫.此外,vtable本身占用(一个LITTLE)内存,并且在每个类实例的开头(具有虚函数)的size_t值内存被分配给vtable指针.IOW,"纯C"最终会稍快一些(尽管如果你发现自己用函数指针模拟类,请回到C++).

  • @On Freund - 不一定 - 他没有特别提到VC++.VC将调试信息实现为PDB,但是如果使用DMC或MinGW GCC进行编译,则调试信息将包含在目标文件中. (3认同)

MSa*_*ers 5

旧的"LIBCTiny"技巧仍然有效.使用现代VC++版本,您可能需要转换一些功能.

另一个要知道的好方法是lstr*在Kernel32中收集函数.那已经在记忆中了,所以这些功能可能是一个更精简的选择.