使用 LIBCTINY.LIB 为 EXE 和 DLL 文件 减肥
2007-03-17 21:26:43 来源:WEB开发网不过,我们再看看其它函数,比如 __sbh_heap_init。它是运行库的堆初始化程序, 而Win32的操作系统也提供了一些类似 HeapAlloc 的函数来实现堆分配。虽然C++运行库选择Win32的堆函数可能带来性能上的提高,但是 Visual C++ 并没有这样做。所以最后在可执行文件上增加了许多不必要的代码。
有些人并不介意运行库实现自己的堆,但这里有更缺乏说服力的例子。看看 map 文件底部的 __crtMessageBoxA 函数,这个函数使得可执行文件可以通过运行库而非 USER32.dll 来调用 MessageBox API。但对于一个简单的hello world 程序来说,是否要调用 MessageBox 是很难预见的。
再看一个例子:函数 __crtLCMapStringA 将字符串转做区域转换。区域支持是微软的责任,但是对大多数程序并不需要。所以就没有必要为区域转换花费开销。
我还可以继续列举那些不必要的东西,不过我已经证明了自己的观点:一个典型的小程序包含了很多不会被使用的代码,对于各个代码片段而言,并没有增加了多少代码的尺寸,但是将它们全部加起来将是相当可观的。
关于C++动态连接的运行库
留心的读者可能会说,“Matt! 为什么不使用C++动态链接的运行库?”。在过去我不会这样用,因为在 Windows 95, Windows 98, Windows NT 3.51, Windows NT 4.0 这几个平台中C++动态链接的运行库命名不统一。不过幸运的是,现在情况改变了,大多数情况下你绝对可以信赖你机器上的 MSVCRT.DLL。
重新编译你的MSVCRT (译者注:cl /O1 /MD Hood.c /link /map), 很不错,可执行文件只有16KB。重要的是你把一些不需要的代码移到了 MSVCRT.DLL。只不过在程序启动的时候你要多引导一个DLL。此DLL还包含了类似区域转换的支持。如果MSVCRT能够满足你的需要,那么就尽量使用它。只不过,我还是相信使用一个裁减的,静态运行库是个不错的东西。
更多精彩
赞助商链接