user-0 提问: 64位的hello world程序，你们编译出来有多少kb？

回复:
user: user-1
content: 引用 6 楼 BAO BAO 的回复:[quote=引用 1 楼 zilaishuichina 的回复:] 请问这个问题有什么意义 没有意义 我就不会发帖问了，你想不明白有何用处  就以为没意义吗？   好多环境要求极小的二进制文件，我只是想知道大家的一般是多少字节 经常看别人的帖子里  有人不回答问题 反问楼主提问有何意义？  且先不论人家的意义是什么？  你觉得什么才是有意义呢？   有科学家去证明鸡和蛋的先后？  你觉得有什么意义？ 有科学家证明1+1 为什么等于2   你觉得有什么意义？   看的多了  今天忍不住吐槽一下，。。。。 好多事情不是你看到的表象  你想不到的用途 不能说没意义  我是要编译别的代码  要求最小2kb     如果修改函数入口64位可以做到3.5kb 我还觉得有点大  如果实在不行就用汇编写了  最后我就发这个帖以简单的 Hello world 为例子     问下大家编译的默认Release版本  是多大？  用的哪个版本  做个参考而已      [/quote] 一般的程序员就会编写代码运行，OK没问题。 能做到楼主这样想到的去优化缩小应用程序体积的都是高级程序员。一般的小程序员根本无法理解，楼主无视就好了，没有必要与不在一个层次上的人论长短。

user: user-2
content: 引用 6 楼 wqte45 的回复:[quote=引用 1 楼 zilaishuichina 的回复:] 请问这个问题有什么意义 没有意义 我就不会发帖问了，你想不明白有何用处  就以为没意义吗？   好多环境要求极小的二进制文件，我只是想知道大家的一般是多少字节 经常看别人的帖子里  有人不回答问题 反问楼主提问有何意义？  且先不论人家的意义是什么？  你觉得什么才是有意义呢？   有科学家去证明鸡和蛋的先后？  你觉得有什么意义？ 有科学家证明1+1 为什么等于2   你觉得有什么意义？   看的多了  今天忍不住吐槽一下，。。。。 好多事情不是你看到的表象  你想不到的用途 不能说没意义  我是要编译别的代码  要求最小2kb     如果修改函数入口64位可以做到3.5kb 我还觉得有点大  如果实在不行就用汇编写了  最后我就发这个帖以简单的 Hello world 为例子     问下大家编译的默认Release版本  是多大？  用的哪个版本  做个参考而已      [/quote]  没有意义是因为，你希望可以参考，实际上不一定有参考价值。大部分情况下，我们不会针对“要求极小的二进制文件”去做特别优化，所以就算我现在写一个hello world，用的普通默认的release编译参数，得出来的结果，也许我现在编出来，几百K，比加了各种优化选项的大上很多，那是不是代表只有几K的，甚至不到1K的，把编译器提供的各种优化选项加上，那就是最小的，就已经优化到位了呢？没有最小，只有更小。hello world也许可以做教学例子，但是能举个例子不等于是一个有代表性的例子。  你可以给出你的代码，你实际要实现的功能需求，然后你做了哪些优化了，现在是一个什么结果，然后你希望它能更小一点，还可以怎么做，而不是上来先问别人的程序多大，来给你做参考。就像一个学生考试考了95，然后问别人考多少分，如果有人只考了90分，你会觉得比他考的好，如果还有人考100分，你会觉得这次没考好，还有人附加题全对，考了120，你觉得这是大神，这有意义么。  具体情况具体分析吧，我相信lz你实际要优化的肯定不是hello world（如果是的话，也不用来提问了，网上很多TinyHelloWorld可以参考，最小的貌似能优化到100B左右的样子）。但是一个产品级的项目，你有你实际的生产环境，实际的项目需求。可能你们的产品经理修改了一下项目需求，你不需要再链接某个库了，你的最终的二进制文件就能小上很多。如果增加了某个需求，需要多链接一个库，你之前好不容易降下来的大小，一夜回到解放前。很多优化都是在程序之外的。比如我是不是可以考虑把一些功能需求放到脚本里去做，程序里面就调用各种脚本就好了。  网上有很多专门针对hello world做优化的奇技淫巧，但是都是为了研究可执行程序的链接，库的装载。lz如果是要编译windows程序，还可以考虑PE头的优化。但是不一定适用于你正真想要优化的那个程序，  最后，如果你只是想做技术研究的话，可以推荐你一本书《程序员的自我修养-链接,装载与库》，实现了一个minicrt，可以参考。

user: user-3
content: 使用c库，动态链接到msvcrt或者libc，也可以比较小，小于1K。

user: user-3
content: 低于512字节的在64位系统上都无法运行。

user: user-4
content: “你想不明白有何用处  就以为没意义吗？   ” 自以为是。 引用 6 楼 wqte45 的回复:[quote=引用 1 楼 zilaishuichina 的回复:] 请问这个问题有什么意义 没有意义 我就不会发帖问了，你想不明白有何用处  就以为没意义吗？   好多环境要求极小的二进制文件，我只是想知道大家的一般是多少字节 经常看别人的帖子里  有人不回答问题 反问楼主提问有何意义？  且先不论人家的意义是什么？  你觉得什么才是有意义呢？   有科学家去证明鸡和蛋的先后？  你觉得有什么意义？ 有科学家证明1+1 为什么等于2   你觉得有什么意义？   看的多了  今天忍不住吐槽一下，。。。。 好多事情不是你看到的表象  你想不到的用途 不能说没意义  我是要编译别的代码  要求最小2kb     如果修改函数入口64位可以做到3.5kb 我还觉得有点大  如果实在不行就用汇编写了  最后我就发这个帖以简单的 Hello world 为例子     问下大家编译的默认Release版本  是多大？  用的哪个版本  做个参考而已      [/quote]

user: user-5
content: gcc 用 ldscript， 控制起来比 link 更精细些， 稍微麻烦点， 效果差不多 ..

user: user-6
content: 链接器——清单文件——生成清单文件 改成：否，还可以再小掉512KB，因为默认的文件对齐是512

user: user-5
content: WIN10  64 位完全正常，   把除  .idata 外的段全部合并掉， 段属性RWE， 不会不可执行 ...   这样子 784 字节 ... 就比 汇编多 exception table 不知道咋移除了 .... cl -O1 1.c -nologo -link -entry:main -merge:.data=.text -merge:.rdata=.text -merge:.pdata=.text kernel32.lib -align:16 -release -nocoffgrpinfo   引用 14 楼 wqte45 的回复:[quote=引用 12 楼 mLee79的回复:]忘加 align 了， 加了 1.1K  cl -O1 1.c -nologo -link -entry:main -merge:.data=.text kernel32.lib -align:16 你用的vc?    我用的tdm-gcc   没发现有合并节表的merge类似参数啊？ 而且用align参数设置文件对齐字节，像你设置这么小的话   windows xp下是可以运行的  但是在windows 7 64bit系统上是运行不了的   windows 7上只要设置文件的align小于512字节（200h）  编译后的文件都不能运行呢?[/quote]

user: user-0
content: 引用 12 楼 mLee79的回复:忘加 align 了， 加了 1.1K  cl -O1 1.c -nologo -link -entry:main -merge:.data=.text kernel32.lib -align:16 你用的vc?    我用的tdm-gcc   没发现有合并节表的merge类似参数啊？ 而且用align参数设置文件对齐字节，像你设置这么小的话   windows xp下是可以运行的  但是在windows 7 64bit系统上是运行不了的   windows 7上只要设置文件的align小于512字节（200h）  编译后的文件都不能运行呢?

user: user-5
content: 1008  cl -O1 1.c -nologo -link -entry:main -merge:.data=.text -merge:.rdata=.text -merge:.pdata=.text kernel32.lib -align:16

user: user-5
content: 忘加 align 了， 加了 1.1K  cl -O1 1.c -nologo -link -entry:main -merge:.data=.text kernel32.lib -align:16

user: user-5
content: 2.5K ,  win 下直接 syscall 写控制台很麻烦， 不然可以很小， linux 下很简单     $ cat 1.c ; cl -O1 1.c -nologo -link -entry:main -merge:.data=.text kernel32.lib ; ls -l 1.exe ; ./1.exe #include <windows.h>  #define MESSAGE         "Hello world!\n"  int main() {         DWORD dwWr = 0;         WriteConsole(                 GetStdHandle(STD_OUTPUT_HANDLE ),                 MESSAGE, sizeof(MESSAGE)-1, &dwWr, NULL); return 0; } 1.c LINK : warning LNK4254: 节“.data”(C0000040)合并到具有不同特性的“.text”(60000020) -rwxr-xr-x 1  None 2.5K 2月  18 22:21 1.exe* Hello world!

user: user-7
content: 链接C库，大小为6k

user: user-6
content: 引用 7 楼 那年那人的回复:[quote=引用 4 楼 paschen 的回复:] VS2015，不使用C/C++标准库，仅使用WIN32 API的话，我这里32位程序大小：3584字节，64位程序大小：4096字节  需要使用c标准库的，请问版主你的api版本的代码  修改函数入口了吗  还是默认编译就4096字节？[/quote] 有修改入口，用C/C++语言，但没使用标准库，后面发的链接是那个工程的下载链接，你可以下载了看下

user: user-6
content: 其次，如果使用标准库，使用MT（静态）与MD（动态）会有较大差异，编译时按大小优化，以及对映像文件的一些设置都会影响到其最终大小

user: user-0
content: 引用 1 楼 zilaishuichina 的回复:请问这个问题有什么意义 没有意义 我就不会发帖问了，你想不明白有何用处  就以为没意义吗？   好多环境要求极小的二进制文件，我只是想知道大家的一般是多少字节 经常看别人的帖子里  有人不回答问题 反问楼主提问有何意义？  且先不论人家的意义是什么？  你觉得什么才是有意义呢？   有科学家去证明鸡和蛋的先后？  你觉得有什么意义？ 有科学家证明1+1 为什么等于2   你觉得有什么意义？   看的多了  今天忍不住吐槽一下，。。。。 好多事情不是你看到的表象  你想不到的用途 不能说没意义  我是要编译别的代码  要求最小2kb     如果修改函数入口64位可以做到3.5kb 我还觉得有点大  如果实在不行就用汇编写了  最后我就发这个帖以简单的 Hello world 为例子     问下大家编译的默认Release版本  是多大？  用的哪个版本  做个参考而已

user: user-0
content: 引用 4 楼 paschen 的回复:VS2015，不使用C/C++标准库，仅使用WIN32 API的话，我这里32位程序大小：3584字节，64位程序大小：4096字节  需要使用c标准库的，请问版主你的api版本的代码  修改函数入口了吗  还是默认编译就4096字节？

user: user-6
content: http://download.csdn.net/download/paschen/10251394

user: user-6
content: VS2015，不使用C/C++标准库，仅使用WIN32 API的话，我这里32位程序大小：3584字节，64位程序大小：4096字节

user: user-3
content: 只要连接了C库就不可能很小，汇编写的可以到2.5K。