Có mã này:Exception handler
char text[] = "zim";
int x = 777;
Nếu tôi nhìn vào ngăn xếp trong đó x và văn bản được đặt ở đó đầu ra là:
09 03 00 00 7a 69 6d 00
đâu:
- 09 03 00 00 = 0x309 = 777 < - int x = 777
- 7a 69 6d 00 = văn bản char [] = "zim" (mã ASCII)
Hiện nay là mã với try..catch:
char text[] = "zim";
try{
int x = 777;
}
catch(int){
}
Stack:
09 03 00 00 **97 85 04 08** 7a 69 6d 00
Bây giờ giữa văn bản và x được đặt giá trị 4 byte mới. Nếu tôi thêm một lượt đánh bắt khác, thì sẽ có một cái gì đó như:
09 03 00 00 **97 85 04 08** **xx xx xx xx** 7a 69 6d 00
v.v. Tôi nghĩ rằng đây là một số giá trị được kết nối với xử lý ngoại lệ và nó được sử dụng trong quá trình xếp thư giãn để tìm thấy bắt thích hợp khi ngoại lệ được ném vào khối thử. Tuy nhiên, câu hỏi là, chính xác giá trị 4 byte này là gì (có thể một số địa chỉ cho cấu trúc xử lý ngoại lệ hoặc một số id)?
Tôi sử dụng g ++ 4.6 trên máy Linux 32 bit.
Xem [C++ try/throw/catch => machine code] (http://stackoverflow.com/questions/1331220/c-try-throw-catch-machine-code), trỏ đến http: // www .codeproject.com/Articles/2126/How-aC-compiler-thực hiện-ngoại lệ-xử lý –
Tại sao bạn muốn biết. Ngay cả khi chúng tôi đã cho bạn một câu trả lời nó sẽ được cụ thể cho trình biên dịch và phiên bản cụ thể của trình biên dịch. Vì vậy, về mặt kỹ thuật nó không phải là một câu hỏi C++. Đó là một câu hỏi về g ++ và cách nó hoạt động. Mà trừ khi bạn đang thực sự vào viết phần mở rộng cho g ++ là hoàn toàn vô dụng kiến thức. –
@LokiAstari: g ++ và các trình biên dịch C++ khác cho * nix sử dụng [Itanium ABI] (http://sourcery.mentor.com/public/cxx-abi/abi-eh.html) trên hầu hết các plaforms (với một số sửa đổi tùy thuộc vào nền tảng), vì vậy nó không * mà * nền tảng/trình biên dịch cụ thể. Và vẫn còn, nó thú vị để biết làm thế nào các máy móc xử lý ngoại lệ có thể được thực hiện. –