2009-08-25 33 views
33

Về mặt tinh thần, tôi đã luôn tự hỏi làm thế nào thử/ném/bắt ngoại hình, khi biên dịch C++ dịch nó thành assembly. Nhưng kể từ khi tôi không bao giờ sử dụng nó, tôi không bao giờ có xung quanh để kiểm tra xem nó ra (một số người sẽ nói lười biếng).C++ try/throw/catch => mã máy

Ngăn xếp bình thường có được sử dụng để theo dõi try s hoặc là ngăn xếp theo chủ đề riêng biệt được lưu giữ riêng cho mục đích này không? Việc triển khai giữa MSVC và g ++ lớn hay nhỏ? Xin vui lòng cho tôi xem một số giả asm (IA-32 là ok quá) vì vậy tôi không bao giờ phải kiểm tra xem nó ra bản thân mình! :)

Chỉnh sửa: Bây giờ tôi có được kiến ​​thức cơ bản về triển khai MSVC về xử lý IA-32. Bất cứ ai biết cho g + + trên IA-32, hoặc bất kỳ CPU khác cho rằng vấn đề?

Trả lời

7

Microsoft của Tạp chí "Under the Hood" series đã một chiều sâu nhìn vào đó rất chủ đề trở lại vào năm 1997:

A Crash Course on the Depths of Win32™ Structured Exception Handling

+0

Điều đó bao gồm Xử lý ngoại lệ có cấu trúc của Windows, có liên quan đến, nhưng không giống như, xử lý ngoại lệ C++.Pietrek đề cập trong phần giới thiệu rằng ngoại lệ C++, như được thực hiện bởi Microsoft và Borland, sử dụng SEH, nhưng bài viết của ông không bao gồm * cách * họ thực hiện nó. –

+0

Bài viết MSVC/IA-32 tuyệt vời, mặc dù dài. –

+1

Ngoại lệ C++ chỉ là một lớp ngoại lệ SEH, với trình bao bọc để bao gồm thông tin C++ (cá thể lớp ngoại lệ). Các ngoại lệ C++ phải sử dụng SEH để chúng truyền các ranh giới hạt nhân, v.v. –

15

Đây là một bài viết rất có giá trị về chủ đề này: How a C++ compiler implements exception handling

+1

Bài viết này đã được xuất bản vào năm 2002 ... có thực sự cập nhật không? – Klaim

+0

Tôi đã xem tổng quan từ lâu. Tôi không thực sự chắc chắn nếu nó được cập nhật. – AraK

+13

2002 là khá gần đây theo tiêu chuẩn C++ – Javier

0

Có một cái nhìn tại this document trong đó mô tả bên trong của xử lý khá tốt ngoại lệ.

18

triển khai Poor trình xử lý ngoại lệ đẩy một số loại khối xử lý ngoại lệ đối với từng thử mệnh đề trên ngăn xếp thời gian chạy khi mệnh đề try được nhập vào, và bật nó ra khi mệnh đề try được thoát. Vị trí giữ địa chỉ của khối xử lý ngoại lệ được đẩy gần đây nhất cũng được duy trì. Thông thường, các trình xử lý ngoại lệ này được xích lại với nhau để chúng có thể được tìm thấy bằng cách theo các liên kết từ các phiên bản gần đây nhất đến các phiên bản cũ hơn. Khi một ngoại lệ xảy ra, một con trỏ tới khối xử lý EH được đẩy cuối cùng được tìm thấy, và việc xử lý các trường hợp EH của mệnh đề "try" được kiểm tra. Một cú đánh vào một trường hợp EH làm cho việc dọn dẹp ngăn xếp xảy ra trở lại điểm EH được đẩy và điều khiển chuyển sang trường hợp EH. Không có lần truy cập nào vào EH làm cho EH tiếp theo được tìm thấy và quá trình lặp lại. Lược đồ SEH Windows 32 bit là một phiên bản này.

Đây là một triển khai kém bởi vì chương trình trả một giá thời gian chạy cho mỗi mệnh đề thử (push sau đó bật) ngay cả khi không có ngoại lệ xảy ra.

Triển khai tốt chỉ cần ghi lại một bảng các phạm vi trong đó các điều khoản thử xảy ra. Điều này có nghĩa là không có chi phí để nhập/thoát một mệnh đề thử. (My PARLANSE ngôn ngữ lập trình song song sử dụng kỹ thuật này). Một ngoại lệ tra cứu PC của điểm ngoại lệ trong bảng và chuyển điều khiển đến EH được chọn bởi bảng. Mã EH đặt lại stack khi thích hợp. Nhanh và đẹp. Tôi nghĩ rằng Windows 64 bit EH thuộc loại này, nhưng tôi đã không xem xét cẩn thận.

3

Ủy ban tiêu chuẩn C++ đã xuất bản một báo cáo kỹ thuật về "hiệu suất C++" để loại bỏ nhiều huyền thoại về cách các tính năng C++ được cho là làm chậm bạn xuống. Điều này cũng bao gồm các chi tiết về cách xử lý ngoại lệ có thể được thực hiện. draft của báo cáo kỹ thuật này có sẵn miễn phí. Kiểm tra phần 5.4.1. "Các vấn đề và kỹ thuật triển khai xử lý ngoại lệ".

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