Почему компилятор Go выполняет эту оптимизацию - PullRequest
0 голосов
/ 29 мая 2020
package main

import (
    "fmt"
)

func main() {
    a := new(struct{})
    b := new(struct{})
    println(a, b, a==b)

    c := new(struct{})
    d := new(struct{})
    fmt.Println(c, d, c==d)
}

вывод:

0xc000107f37 0xc000107f37 false
&{} &{} true

И после отключения оптимизации компилятора я получу разные результаты.

0xc000087e4e 0xc000087e4e true
&{} &{} true

Почему компилятор Go выполняет эту оптимизацию?

См. [Эту строку в исходном коде среды выполнения]

(https://github.com/golang/go/blob/6317adeed7815ad335e2e97c463a7c3c4d82fc19/src/runtime/malloc.go#L586)

    if size == 0 {
        return unsafe.Pointer(&zerobase)
    }

Я думаю, что поскольку все переменные нулевого размера будет выделен с нулевой базой, он должен печатать true вместо false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...