伙计我想开始用C ++编程。我已经在vb6,vb.net中编写了一些程序,现在我想获得C ++知识,我想要的是一个可以将我的代码编译到最小的Windows应用程序的编译器。例如,有一个名为PureBasic的Basic语言编译器可以使Hello world独立应用程序的大小为5 kb,而我编译的简单套接字程序只有12kb(没有任何DLL-s和Runtime文件)。我知道它很棒,所以我想要这样的C ++。
如果我错了并且没有这种类型的Windows编译器可以有人给我一个网站或书籍,可以教我如何减少C ++可执行文件的大小,或者如何使用Windows API调用?
答案 0 :(得分:5)
Microsoft Visual C ++编译器例如......您只需关闭到C运行时(/NODEFAULTLIB
)的链接,您的可执行文件将小到5KB。只有一个问题:您将无法使用标准C和C ++库中的任何内容,也无法使用C ++的标准功能,如异常处理,new
和delete
运算符,浮点算术,以及更多。您只需要使用纯OS功能(例如,使用CreateFile
创建文件,使用HeapAlloc
分配内存等)。
答案 1 :(得分:4)
多年前我用VC6做过这个。这是必要的,因为可执行文件将通过网络传输到目标计算机,在那里它将运行。由于它可能通过调制解调器连接发送,因此需要尽可能小。为了缩小可执行文件,我依赖于两种技术:
最终的可执行文件大小:~2K
答案 2 :(得分:1)
运行Windows的现代台式电脑至少有1Gb内存和一个巨大的硬盘驱动器,担心一个不能代表任何真实应用程序的琐碎程序的大小是毫无意义的。
任何语言的“Hello world”程序的大部分都是固定开销,与建立执行环境以及加载和启动代码有关。对于任何非平凡的应用程序,您应该更关心代码大小随着更多功能的增加而增加的速率。从这个意义上讲,任何编译器中的C ++代码都非常有效。也就是说,你的PureBasic程序可以做很少或没有什么可能比同等的C ++程序小,但是当你在代码中构建有用的功能时,情况并不一定如此。
@user:C ++确实产生了小的目标代码,但是如果printf()(或cout<<)的代码是静态链接的,那么生成的可执行文件可能会更大,因为printf()具有很多功能,没有在“hello world”程序中使用,所以是多余的。例如,尝试使用puts(),您可能会发现代码更小。
此外,你确定你正在比较苹果和苹果吗?某些执行环境依赖于动态链接的运行时库或虚拟机,该虚拟机提供可能在C ++程序中静态链接的功能。
答案 3 :(得分:0)
我不知道为什么你在学习语言之前对这种优化感兴趣,但无论如何......
您使用的编译器没有太大区别,但是如何使用它。选择像Visual Studio C ++或MinGW这样的编译器,并阅读其文档。您将找到有关如何针对大小或性能优化编译的信息(通常在优化大小时,您会失去性能,反之亦然)。
例如,在Visual Studio中,您可以通过将/ O1参数传递给编译器(或Project Properties / C-C ++ / Optimization)来最小化可执行文件的大小。
另外不要忘记在“发布”模式下编译,或者您的可执行文件可能充满了调试符号,这将增加可执行文件的大小。
答案 4 :(得分:0)
在Visual C ++中将以下代码的可执行文件大小从24k减少到1.6k
int main (char argv[]) {
return 0;
}
链接器开关(尽管建议安全对齐为512):
/ FILEALIGN:16 / ALIGN:16
链接(在VC ++项目属性中): LIBCTINY.LIB
其他用法(这将解决Feruccio的建议):
#ifdef NDEBUG
#pragma optimize("gsy",on)
#pragma comment(linker,"/merge:.rdata=.data")
#pragma comment(linker,"/merge:.text=.data")
#pragma comment(linker,"/merge:.reloc=.data")
#pragma comment(linker,"/OPT:NOWIN98")
#endif // NDEBUG
int main (char argv[]) {
return 0;
}
但是,我仍然看到大部分的ASCII(0)构成了可执行文件的三分之一,并且在所有的操作完成之后,“ Rich” Windows签名(我正在读取它并不需要程序执行)仍然存在。以上已应用。
答案 5 :(得分:-1)
我不想回复死亡帖子,但由于没有一个回复提到这个(除了Mat回复)......
在我之后重复:C ++!=(vb6 || vb.net || basic)。而且我不只是提到语法,C ++编码风格通常与VB中的不同,因为C ++程序员试图通常比vb程序员更好地设计...
P.S。:不,在C ++世界中没有复制粘贴的地方。对不起,不得不说这个......