Ответ 1
Похоже, BigData{}
в функции Clear()
вызывает жесткое кодирование массива из 80 000 000 байтов = sizeof uint64 * 10 * 1000 * 1000
в двоичном формате.
Я новичок в голанге. Я написал код следующим образом:
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
}
Похоже, BigData{}
в функции Clear()
вызывает жесткое кодирование массива из 80 000 000 байтов = sizeof uint64 * 10 * 1000 * 1000
в двоичном формате.