2015-04-15 11 views
5

Go ma bardzo niefortunny brak wbudowanych twierdzeń. Chcę wdrożyć je w ten sposób:Czy Go optymalizuje out nieosiągalne instrukcje if?

const ASSERT = true 

func SomeFunction() { 
     if ASSERT && !some_condition_that_should_always_be_true() { 
       panic("Error message or object.") 
     } 
} 

Moje pytanie brzmi, czy będzie-oświadczenie być optymalizowane, czy mogę zdefiniować const ASSERT = false?

+3

Specyfikacja go nie wymusza usunięcia martwego kodu. Konkretna implementacja może zrobić to tak agresywnie, jak uważa za stosowne. – JimB

+1

@JimB http://golang.org/ref/spec#Constant_expressions ocenianych podczas kompilacji? – Uvelichitel

+1

@Uvelichitel: tak, ale to nie ma nic wspólnego z usuwaniem martwego kodu. Kompilator może nadal pozostawić blok if w skompilowanym obiekcie. – JimB

Odpowiedz

7

Jak zauważają ludzie w komentarzach do twojego pytania, jest to specyficzne dla implementacji.

gc usuwa go. Możesz zbudować swój program za pomocą -gcflags '-S' i zobaczyć, że część ASSERT nie jest częścią binarną.

E.g. skompiluj następujący kod z -gcflags '-S', a zobaczysz, że kod na liniach 8 i 9 jest zawarty, ale zmień Assert na false, a nie będzie ich w liście asów.

package main 

const Assert = true 

var cond = true 

func main() { 
    if Assert && !cond { 
     panic("failed") 
    } 
} 

EDIT:

chodzi o gccgo, usuwa ten kod na -O1 i powyżej. Widać to po kompilacji tego samego kodu z

go build -compiler gccgo -gccgoflags '-O1' main.go 

a następnie robi

objdump -S main 

zobaczyć uwagami montaż.

+0

Nigdy nie zdałem sobie sprawy, że 'objdump' ma opcję' -S', dziękuję! (i dzięki za samą odpowiedź ...) – Matt

Powiązane problemy