Почему этот код генерирует очень большой исполняемый файл в go (около 81M)?

Я новичок в голанге. Я написал код следующим образом:

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() генерирует такой большой исполняемый файл? Он должен вызываться во время выполнения, а не компилировать время, правильно?

------------ дальнейшее расследование -----------

Просветленный @FUZxxl, я изменил код, чтобы использовать глобальную переменную в 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{} в вашей функции. Обходной путь (благодаря [email protected]):

func (self *BigData) Clear() {
-   *self = BigData{}
+   var zero BigData
+   *self = zero
} 

Ответы

Ответ 1

Похоже, BigData{} в функции Clear() вызывает жесткое кодирование массива из 80 000 000 байтов = sizeof uint64 * 10 * 1000 * 1000 в двоичном формате.