2015-04-15 19 views
5

Đi có một sự thiếu xác nhận tích hợp rất đáng tiếc. Tôi muốn triển khai theo cách này:Go có tối ưu hóa các tuyên bố nếu không thể truy cập được không?

const ASSERT = true 

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

Câu hỏi của tôi sẽ là câu lệnh if được tối ưu hóa nếu tôi xác định const ASSERT = false?

+3

Thông số di chuyển không thực thi bất kỳ việc xóa mã chết nào. Một triển khai cụ thể là miễn phí để làm như vậy một cách tích cực khi nó thấy phù hợp. – JimB

+1

@JimB http://golang.org/ref/spec#Constant_expressions được đánh giá vào thời gian biên dịch? – Uvelichitel

+1

@Uvelichitel: có, nhưng điều đó không liên quan gì đến việc xóa mã chết. Trình biên dịch vẫn còn miễn phí để rời khỏi khối nếu trong đối tượng được biên dịch. – JimB

Trả lời

7

Như được ghi chú bởi những người trong nhận xét cho câu hỏi của bạn, đó là cách triển khai cụ thể.

gc sẽ xóa nó. Bạn có thể xây dựng chương trình của mình với -gcflags '-S' và thấy rằng phần ASSERT không có trong phần nhị phân.

Ví dụ: biên dịch mã sau với -gcflags '-S' và bạn sẽ thấy mã trên các dòng 8 và 9 được bao gồm, nhưng thay đổi Assert thành sai và chúng sẽ không có trong danh sách asm.

package main 

const Assert = true 

var cond = true 

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

EDIT:

Đối với gccgo, nó loại bỏ mã này ở -O1 trở lên. Bạn có thể thấy nó bằng cách biên dịch mã cùng với

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

và sau đó làm

objdump -S main 

để xem lắp ráp được chú thích.

+0

Tôi không bao giờ nhận ra 'objdump' có tùy chọn' -S', cảm ơn! (và cảm ơn câu trả lời thực sự, ...) – Matt

Các vấn đề liên quan