英文:
Go binary size in comparison with c
问题
昨天,我只是想比较一下简单的 Golang 的 HelloWorld
应用和 C 语言的差异。Golang 的二进制文件大约为 2-3 MB(只有 fmt.Println
),而等效的 C 代码只有大约 20 kb(printf
)。然后,我使用 strace
检查了两个二进制文件的系统调用,发现它们之间没有太大的差异。你有什么想法,为什么相比之下,Golang 的二进制文件如此庞大?
英文:
Yesterday I just wanted to compare simple golang HelloWorld
app with c, go binary was something like 2-3 MB
(just fmt.Println
) the equivalent c code, however, was just about 20 kb (printf
). Then I checked system calls both binaries were doing, using strace
; there was not a huge difference between both so do you have any idea why golang binary is so massive in comparison with c equivalent?
答案1
得分: 7
Go二进制文件默认情况下是静态链接的,并且还包含更多的信息,例如关于类型的信息,这使得反射、类型断言等操作成为可能。引用Go FAQ中的一段话:
gc工具链中的链接器默认创建静态链接的二进制文件。因此,所有的Go二进制文件都包含Go运行时,以及支持动态类型检查、反射甚至是panic时的堆栈跟踪所需的运行时类型信息。
在Linux上,使用gcc编译和静态链接的简单C程序“hello, world”大约为750 kB,其中包括printf的实现。
使用等效的Go程序并使用fmt.Printf的话,大小约为2.3 MB,但其中包含了更强大的运行时支持和类型信息。
英文:
Go binaries are, by default, statically linked, and also contain more information such as information about types that allows for reflection, type assertions, and so on. To quote the Go FAQ:
> The linker in the gc tool chain creates statically-linked binaries by
> default. All Go binaries therefore include the Go run-time, along with
> the run-time type information necessary to support dynamic type
> checks, reflection, and even panic-time stack traces.
>
> A simple C "hello, world" program compiled and linked statically using
> gcc on Linux is around 750 kB, including an implementation of printf.
> An equivalent Go program using fmt.Printf is around 2.3 MB, but that
> includes more powerful run-time support and type information.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论