我刚到歌朗。我写了这样的代码:
package main
import (
"fmt"
)
const (
BIG_NUM = 10 * 1000 * 1000
)
type BigData [BIG_NUM]uint64
func (self BigData) String() string {
return fmt.Sprintf("%d\n", self[0])
}
func (self *BigData) Clear() {
*self = BigData{}
}
func main() {
data := new(BigData)
fmt.Println(data)
}
编译后,可执行文件大约为81m:
$ ls -l
-rwxr-xr-x 1 tchen 522017917 81533376 Dec 19 08:44 test
-rw-r--r-- 1 tchen 522017917 290 Dec 19 08:44 test.go
当我删除clear()函数时,可执行文件将变为正常大小。那么为什么这个clear()函数生成这么大的可执行文件呢?它应该在运行时调用,而不是在编译时调用,对吗?
--------进一步调查----------
在@fuzzxl的启发下,我修改了代码以在clear()中使用全局变量。这次文件大小恢复正常。所以全局变量正确地放在.bss部分。
package main
import (
"fmt"
)
const (
BIG_NUM = 10 * 1000 * 1000
)
type BigData [BIG_NUM]uint64
var (
bigData = BigData{}
)
func (self BigData) String() string {
return fmt.Sprintf("%d\n", self[0])
}
func (self *BigData) Clear() {
*self = bigData
}
func main() {
data := new(BigData)
fmt.Println(data)
}
编译的可执行文件:
$ ls -l
-rwxr-xr-x 1 tchen 522017917 1534384 Dec 19 10:55 test
-rw-r--r-- 1 tchen 522017917 318 Dec 19 10:55 test.go
--------最新更新----------
到目前为止,这似乎是一个编译器问题。已提交错误:https://code.google.com/p/go/issues/detail?id=6993。如果你感兴趣的话,你可以跟进。
在有任何解决方案之前,应该避免在函数中使用
x := Y{}
。解决方法是(感谢acity@pbrane.org):func (self *BigData) Clear() {
- *self = BigData{}
+ var zero BigData
+ *self = zero
}
最佳答案:
似乎BigData{}
函数中的Clear()
导致8000000字节的数组=sizeof uint64 * 10 * 1000 * 1000
硬编码到二进制文件中。