2015-04-15 33 views
5

Go ha una sfortunata mancanza di affermazioni incorporate. Voglio realizzare loro in questo modo:Go ottimizza le if-statement irraggiungibili?

const ASSERT = true 

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

La mia domanda è la volontà istruzione if-essere ottimizzata se definisco const ASSERT = false?

+3

La specifica go non applica alcuna rimozione di codice guasto. Una particolare implementazione è libera di farlo in modo aggressivo come meglio ritiene opportuno. – JimB

+1

@JimB http://golang.org/ref/spec#Constant_expressions valutate al momento della compilazione? – Uvelichitel

+1

@Uvelichitel: sì, ma questo non ha nulla a che fare con la rimozione del codice morto. Il compilatore è ancora libero di lasciare il blocco if nell'oggetto compilato. – JimB

risposta

7

Come notato dalle persone nei commenti alla tua domanda, è specifico per l'implementazione.

gc lo rimuove. È possibile creare il programma con -gcflags '-S' e verificare che la parte ASSERT non sia nel file binario.

E.g. compila il codice seguente con -gcflags '-S', e vedrai che il codice sulle linee 8 e 9 è incluso, ma cambia Assert in modo che sia falso e non sarà presente nell'elenco Asm.

package main 

const Assert = true 

var cond = true 

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

EDIT:

Per quanto riguarda gccgo, rimuove il codice a -O1 e superiori. Lo si può vedere compilando lo stesso codice con

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

e poi facendo

objdump -S main 

per vedere il gruppo annotato.

+0

Non ho mai capito che 'objdump' aveva un'opzione '-S', grazie! (e grazie per la risposta vera, anche ...) – Matt