Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binary 为什么Go会为小程序生成大的二进制文件?_Binary_Go_Size - Fatal编程技术网

Binary 为什么Go会为小程序生成大的二进制文件?

Binary 为什么Go会为小程序生成大的二进制文件?,binary,go,size,Binary,Go,Size,为什么Go编译器会生成大的二进制文件 例如,在编译以下代码后,我得到一个1.8MB的exec文件 package main import "fmt" func main(){ fmt.Println("Hello World") } 我在Ubuntu和Win7上测试了上述代码,结果是一样的 我还用+70行代码编写了一个更大的程序,得到的二进制文件惊人地又是1.8MB(实际上有几个字节的差异)。我想知道Go编译器将什么转储到二进制文件中。(摘自Go编程语言常见问题解答): gc工具链(5l

为什么Go编译器会生成大的二进制文件

例如,在编译以下代码后,我得到一个1.8MB的exec文件

package main
import "fmt"
func main(){
   fmt.Println("Hello World")
}
我在UbuntuWin7上测试了上述代码,结果是一样的

我还用+70行代码编写了一个更大的程序,得到的二进制文件惊人地又是1.8MB(实际上有几个字节的差异)。我想知道Go编译器将什么转储到二进制文件中。

(摘自Go编程语言常见问题解答):

gc工具链(5l、6l和8l)中的链接器进行静态链接。因此,所有Go二进制文件都包含Go运行时,以及支持动态类型检查、反射甚至紧急时间堆栈跟踪所需的运行时类型信息

在Linux上使用gcc静态编译和链接的一个简单的C“hello,world”程序大约有750KB,包括printf的一个实现。使用fmt.Printf的等效Go程序约为1.2MB,但其中包括更强大的运行时支持


暗示:由于2MB来自于一大块运行时/标准库中的链接,二进制大小与您编写的代码量不成正比——如果您编写10倍或100倍的Hello World,您通常不会得到18MB或180MB的二进制。@TwoTwo,那么有针对嵌入式系统优化的go版本吗?如果您的目标设备不能采用2MB二进制,你可能不能用围棋。如果您使用
-compiler gccgo
构建,它会将一些标准库推送到设备上所有Go二进制文件共享的
libgo
,但不管怎样,您的程序需要这些代码,并且会在某个地方占用空间(比如说,Java和C需要在目标机器上安装它们的运行时)。另外请注意,Go 1.3的表现要好得多。即使使用Go 1.7,“Hello World”仍然不在meg之下……可能是