2017-02-09 19 views
6

Câu lệnh chuyển đổi ngay lập tức rơi đến vị trí chính xác trong bộ nhớ như thế nào? Với các câu lệnh if lồng nhau, nó phải thực hiện các so sánh với mỗi câu lệnh, nhưng với một câu lệnh chuyển đổi nó đi trực tiếp đến đúng trường hợp. Điều này được thực hiện như thế nào?Cách báo cáo chuyển đổi hoạt động

+6

Trình biên dịch của bạn có thể có một lá cờ để cho bạn thấy mã lắp ráp mà nó tạo ra ... Spoiler: thường lần nó giống như một bó if-s –

+1

Điều gì khiến bạn nghĩ vậy? Và 'if' thì không? Vui lòng cung cấp tham chiếu đến nơi tiêu chuẩn hỗ trợ xác nhận của bạn. – Olaf

+0

@DavidConnolly: bạn có thể chấp nhận câu trả lời không? – chqrlie

Trả lời

15

Có nhiều cách khác nhau để biên dịch câu lệnh switch thành mã máy. Dưới đây là một vài ví dụ:

  • Trình biên dịch có thể sản xuất một loạt các xét nghiệm, mà không phải là quá kém hiệu quả như chỉ khoảng log (N) kiểm tra là đủ để gửi một giá trị trong N thể các trường hợp.

  • Trình biên dịch có thể tạo bảng giá trị và địa chỉ bước nhảy, lần lượt sẽ được sử dụng bằng mã tra cứu chung (tuyến tính hoặc dichotomic, tương tự bsearch()) và cuối cùng chuyển đến vị trí tương ứng.

  • Nếu giá trị trường hợp đủ dày, trình biên dịch có thể tạo bảng địa chỉ bước nhảy và mã kiểm tra xem giá trị chuyển đổi nằm trong phạm vi bao gồm tất cả giá trị của trường hợp và chuyển trực tiếp đến địa chỉ tương ứng. Đây có lẽ là việc triển khai gần nhất với mô tả của bạn: nhưng với tuyên bố chuyển đổi, nó sẽ chuyển trực tiếp đến đúng trường hợp.

Tùy thuộc vào khả năng cụ thể của CPU mục tiêu, cài đặt trình biên dịch, và số lượng và phân bố của các trường hợp giá trị, trình biên dịch có thể sử dụng một trong những cách tiếp cận trên này hay cách khác, hoặc một sự kết hợp của họ, hoặc thậm chí một số Các phương pháp khác.

Nhà thiết kế trình biên dịch dành nhiều nỗ lực cố gắng cải thiện chẩn đoán cho những lựa chọn này. Nhìn vào đầu ra lắp ráp hoặc sử dụng một công cụ trực tuyến như Godbolt's Compiler Explorer để xem các khả năng tạo mã khác nhau.

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