2008-10-12 15 views
9

Tôi đã tự hỏi nếu có bất kỳ sự khác biệt trong cách mã sau đây đã được biên dịch thành lắp ráp. Tôi đã nghe nói rằng trường hợp chuyển đổi là hiệu quả hơn nếu khác, nhưng trong ví dụ này tôi không hoàn toàn chắc chắn nếu đó sẽ là trường hợp.trường hợp chuyển đổi vs nếu khác

if(x==1){ 
... 
}else if(x==2){ 
... 
}else{ 
... 
} 

switch(x){ 
case 1: 
... 
break; 

case 2: 
... 
break; 

default: 
... 
} 
+2

Bạn đã xem xét việc trình biên dịch phát ra trình biên dịch và so sánh mã kết quả? –

+0

Thay vào đó, hãy tránh và sử dụng [hash] (http://hardforo.com/thread-531.html) (mảng kết hợp). Nó sạch hơn. – boctulus

+0

Tìm thấy một cuộc thảo luận tốt ở đây: http://stackoverflow.com/questions/1028437/why-switch-case-and-not-if-else-if – Helene

Trả lời

2

Trong trường hợp cụ thể này, switch thể được biến thành một bảng nhảy. Các if statement (nếu bạn viết của bạn = như == :-P) vẫn có thể làm điều tương tự nếu trình biên dịch có thể nói rằng x không thay đổi giữa if khoản (mà thường là trường hợp, trừ khi xvolatile hay cái gì) .

+0

Những "==" luôn luôn có được tôi. –

7

Trình biên dịch đôi khi sẽ chuyển công tắc thành bảng nhảy, nếu các mục nhập tiếp giáp nhau (hoặc gần như vậy). Hoặc về mặt lý thuyết, nó có thể sử dụng tìm kiếm nhị phân để tìm trường hợp thay vì một loạt các thử nghiệm tuyến tính, sẽ nhanh hơn nếu bạn có một số lượng lớn các trường hợp.

Mặt khác, không có gì ngăn trình biên dịch thực hiện cùng một tối ưu hóa trên cùng một mã được chuyển đổi thành if/else.

Vì vậy, trên trình biên dịch tốt, chuyển đổi có thể nhanh hơn trong một số trường hợp. Trên một trình biên dịch rất tốt, chúng sẽ giống nhau.

3

Lưu ý rằng cấu trúc if/else có thể hiệu quả hơn nếu bạn biết một số trường hợp nhất định có nhiều khả năng hơn các trường hợp khác.

+2

Nhưng trường hợp chuyển đổi được đặt hàng, là tốt, không? – user359996

+1

Tôi không biết liệu tất cả các trình biên dịch có đảm bảo việc đặt hàng hay không. Ngoài ra trình biên dịch có thể tạo ra một bảng nhảy - khi điều này là nhiều hơn hoặc ít hiệu quả hơn nếu/else là trái như là một bài tập cho người đọc. –

+1

Không nên đăng nội dung này làm nhận xét? – FluorescentGreen5