Có trường hợp thực tế nào cho C ++ mà không có ngoại lệ không? [đóng cửa]


40

Trong Khi nào nên sử dụng C trên C ++ và C ++ trên C? Có một tuyên bố wrt. để ngoại lệ kích thước mã / C ++:

Câu trả lời của Jerry (trong số những điểm khác):

(...) Có xu hướng khó sản xuất các tệp thực thi nhỏ hơn với C ++. Đối với các hệ thống thực sự nhỏ, dù sao bạn cũng hiếm khi viết nhiều mã và thêm (...)

Tôi đã hỏi tại sao lại như vậy, Jerry trả lời:

điều chính là C ++ bao gồm xử lý ngoại lệ, mà (ít nhất là thường xuyên) thêm một số tối thiểu vào kích thước thực thi. Hầu hết các trình biên dịch sẽ cho phép bạn vô hiệu hóa xử lý ngoại lệ, nhưng khi bạn thực hiện thì kết quả không còn là C ++ nữa. (...)

điều mà tôi không thực sự nghi ngờ ở cấp độ thế giới thực.


Do đó, tôi rất thích (hoàn toàn tò mò) để nghe từ các ví dụ trong thế giới thực, nơi một dự án đã chọn C ++ làm ngôn ngữ và sau đó chọn vô hiệu hóa các ngoại lệ. (Không chỉ đơn thuần là "không sử dụng" ngoại lệ trong mã người dùng, mà còn vô hiệu hóa chúng trong trình biên dịch, để bạn không thể ném hoặc bắt ngoại lệ.) Tại sao một dự án chọn làm như vậy (vẫn sử dụng C ++ chứ không phải C, nhưng không ngoại lệ) - lý do (kỹ thuật) là gì?


Phụ lục: Đối với những người muốn giải thích các câu trả lời của họ, sẽ rất hay để chi tiết cách xử lý các hàm ý của ngoại lệ:

  • Bộ sưu tập STL ( vector, ...) không hoạt động đúng (không thể báo cáo lỗi phân bổ)
  • new không thể ném
  • Nhà xây dựng không thể thất bại

1
Mã thông báo C ++. Máy bay phản lực và ngoại lệ không trộn lẫn.
Coder

1
Một số thông tin khai sáng về các vấn đề với ngoại lệ (và nói chung là C ++) 250bpm.com/blog:4
Ambroz Bizjak

1
@AmbrozBizjak - Tôi sẽ trích dẫn DeadMG từ một bình luận cho bài đăng mà bạn liên kết đến: quote: "Tôi thấy bạn không hiểu ngoại lệ." Tôi đồng ý. Tác giả rõ ràng đã thực hiện một mớ hỗn độn về xử lý ngoại lệ, nhìn vào các ví dụ mà ông đưa ra trong bài đăng đó.
Martin Ba

Câu trả lời:


35

Hầu như bất kỳ trò chơi console nào hiện có trong C ++ với ngoại lệ bị vô hiệu hóa, ngay cả ngày nay. Về mặt đó, thiết lập mặc định cho trình biên dịch C ++ nhắm vào các bảng điều khiển đó. Đôi khi một số tính năng C ++ không được đảm bảo để hoạt động chính xác trên các trình biên dịch đó, như nhiều kế thừa (ví dụ tôi đang nghĩ về trình biên dịch mặc định bảng điều khiển rất nổi tiếng).


Ngoài ra, một ví dụ khác là SDK phần cứng Arduino usnig gcc mà không có ngoại lệ được kích hoạt trong C ++ và những thứ khác như không có STL được cung cấp .


Có một số lý do kỹ thuật, tốt hay xấu, dù sao đi nữa, đó không phải là lời khuyên của tôi mà là những lý do tôi đã nghe:

  1. Hầu hết các bảng điều khiển là hệ thống nhúng thực sự với bộ nhớ và thời gian xử lý hạn chế. Có thể nó sẽ không đúng trong các bảng điều khiển trong tương lai, nhưng những cái hiện tại vẫn còn hạn chế so với PC. Một số máy chơi game cầm tay khó lập trình hơn bất kỳ điện thoại thông minh nào, ví dụ NDS. Tính năng ngoại lệ sẽ thêm bộ nhớ và một chút chi phí tốc độ, ngay cả khi bạn không sử dụng nó. Bạn có thể tự kiểm tra, điều đó đúng ngay cả trên PC.
  2. Trò chơi video trên bảng điều khiển không thể sụp đổ. Họ phải được kiểm tra theo cách tránh bất kỳ sự cố hoặc bất kỳ ngõ cụt, bất kỳ showstoper nào. Đó là lý do tại sao các nhà sản xuất console yêu cầu các trò chơi phải được kiểm tra kỹ lưỡng trước khi xuất bản. Điều đó cũng có nghĩa là quản lý ngoại lệ thêm chi phí không thực sự hữu ích trong trường hợp trò chơi console. Chẳng hạn như trong điện thoại thông minh tốt hơn vì có thể có một số cách để khôi phục hoặc thêm một số mã để gửi email cho bạn vấn đề. Các nền tảng đóng như hầu hết các bảng điều khiển không cho phép điều này. Vì vậy, một hệ thống ngoại lệ không thực sự cần thiết sau tất cả. Bạn "chỉ cần làm cho nó hoạt động chính xác". ;)
  3. Quản lý ngoại lệ, khi bạn không cho phép lỗi và sự cố, có nghĩa là bạn phải thực hiện chiến lược quản lý lỗi. Hệ thống như vậy có thể đủ phức tạp để khiến ai đó làm việc nhiều thời gian để làm cho nó hữu ích. Các nhà phát triển trò chơi không có sự sang trọng để làm việc trên các tính năng được cho là hữu ích trong các sự cố ...
  4. Trình biên dịch không cho phép nó (chưa). Vâng, nó xảy ra.

Tôi nghĩ rằng các trường hợp ngoại lệ có thể hữu ích ngay cả trong các trò chơi, nhưng đó là sự thật rằng trên các trò chơi trên console không thực sự hữu ích.


Cập nhật:

Tôi đang thêm một ví dụ đáng ngạc nhiên khác ở đây: LLVM / CLang không sử dụng ngoại lệ cũng như RTTI vì các lý do sau :

Trong nỗ lực giảm mã và kích thước thực thi, LLVM không sử dụng RTTI (ví dụ: Dynamic_cast <>) hoặc ngoại lệ. Hai tính năng ngôn ngữ này vi phạm nguyên tắc chung của C ++ là "bạn chỉ trả tiền cho những gì bạn sử dụng", gây ra sự phình to ngay cả khi ngoại lệ không bao giờ được sử dụng trong cơ sở mã hoặc nếu RTTI không bao giờ được sử dụng cho một lớp. Vì điều này, chúng tôi tắt chúng trên toàn cầu trong mã.

Điều đó nói rằng, LLVM sử dụng rộng rãi một dạng RTTI được cuộn bằng tay sử dụng các mẫu như isa <>, cast <> và dyn_cast <>. Hình thức RTTI này là chọn tham gia và có thể được thêm vào bất kỳ lớp nào. Nó cũng hiệu quả hơn nhiều so với Dynamic_cast <>.

CLang nổi tiếng với tốc độ biên dịch ofr và các lỗi rõ ràng, nhưng cũng là một trình biên dịch hiếm có mã thực sự dễ theo dõi.


9
(3): bạn cần một chiến lược quản lý lỗi bất kể là gì, nếu bạn sẽ đi cùng với (2). Các vấn đề sẽ xuất hiện, và phần mềm điều khiển của bạn cần phải thất bại nhẹ nhàng và duyên dáng. Tôi không rõ ràng rằng việc tránh các ngoại lệ hoàn toàn giúp mọi việc trở nên dễ dàng hơn.
David Thornley

6
Tất cả các ví dụ tuyệt vời về môi trường thời gian chạy được kiểm soát chặt chẽ trong đó các lỗi được xử lý đúng cách và không có sự kiện "ngoại lệ" nào.
Patrick Hughes

1
@DavidThornley Bởi vì bạn cho rằng hệ thống của giao diện điều khiển sẽ quản lý một số loại lỗi, nhưng nó sẽ không xảy ra. Có thể nó sẽ có trên PS3 hoặc XBox nhưng điều đó sẽ không được phép vượt qua các bài kiểm tra của người xây dựng giao diện điều khiển. Dù sao, phần sụn của hầu hết các bảng điều khiển tiên tiến không linh hoạt như bạn nghĩ. Một game console cần phải có quyền truy cập vào hầu hết tất cả phần cứng của console, vì vậy bạn có thể nghĩ về một game chạy trên console gần giống như nếu nó cũng là "HĐH" của console ... chúng ta càng có nhiều máy chơi game mạnh mẽ, nó càng ít đúng Vì vậy, tôi đồng ý với bạn rằng nó có vẻ lạ đối với một số trường hợp.
Klaim

2
Đây là một câu trả lời hay, tôi cũng muốn nói thêm rằng ngay cả khi một ngoại lệ xuất hiện và gây ra lỗi cho người dùng, anh ta hoặc cô ta phải làm gì với nó bằng D-pad? Giải pháp thực sự duy nhất cho người dùng cuối là khởi động lại.
anon

2
Tôi đã loại bỏ ví dụ điên rồ này bởi vì ai đó trong nhóm của họ đã nói về việc tăng cường KHÔNG CÓ NGOẠI LỆ không có nghĩa là "không sử dụng ngoại lệ" mà là "không có ngoại lệ đối với các quy tắc". Xem permalink.gmane.org/gmane.comp.lib.boost.devel/231377
Klaim

9

Jerry nói: ... kết quả không còn là C ++ nữa , trong khi ẩn dụ của tôi là nó rõ ràng C ++, chỉ là một phương ngữ hơi khác vì các chương trình sử dụng các hình thức, quy ước và phong cách viết khác.

Đây là những lý do chính của tôi để vô hiệu hóa chúng:

Tương thích nhị phân

Ngôn ngữ giao thoa và ranh giới dịch thuật không được xác định rõ ràng hoặc không xác định. Nếu bạn muốn đảm bảo chương trình của bạn hoạt động trong miền của hành vi được xác định, bạn sẽ cần cách ly các ngoại lệ tại các điểm thoát mô-đun.

Kích thước thực thi

Dưới đây là các kích thước nhị phân của một chương trình miễn phí ngoại lệ tôi đã viết, được xây dựng mà không có ngoại lệ được bật:

Không có ngoại lệ:

  • thực thi + phụ thuộc: 330
  • cuối cùng bị tước bỏ thực thi (phát hành bản dựng): 37

Ngoại trừ:

  • thực thi + phụ thuộc: 380
  • thực thi tước cuối cùng (phát hành bản dựng): 44

Nhắc nhở: Đó là một tập hợp các thư viện và chương trình có chứa số lần ném / bắt không. Cờ trình biên dịch không cho phép các ngoại lệ trong thư viện chuẩn C ++. Do đó, chi phí trong thế giới thực là hơn 19% được thấy trong ví dụ này.

Trình biên dịch: apple gcc4.2 + llvm. Kích thước tính bằng MB.

Tốc độ

Mặc dù thuật ngữ "ngoại lệ chi phí bằng không", họ vẫn thêm một số chi phí ngay cả khi không có gì ném. Trong trường hợp trên, đây là một chương trình quan trọng về hiệu suất (Xử lý tín hiệu, Tạo, Trình bày, Chuyển đổi, với các bộ / tín hiệu dữ liệu lớn, v.v.). Ngoại lệ không phải là một tính năng cần thiết trong thiết kế này, trong khi hiệu suất là rất quan trọng.

Chương trình chính xác

Có vẻ như là một lý do kỳ lạ ... Nếu ném không phải là một lựa chọn, bạn phải viết các chương trình được kiểm tra tương đối nghiêm ngặt, chính xác, để đảm bảo chương trình của bạn thực thi chính xác và khách hàng sử dụng giao diện chính xác (nếu bạn đưa ra một lập luận xấu hoặc làm không kiểm tra mã lỗi, thì bạn xứng đáng với UB). Kết quả? Chất lượng thực hiện cải thiện đáng kể và các vấn đề được khắc phục nhanh chóng.

Sự đơn giản

Việc triển khai xử lý ngoại lệ thường không được cập nhật. Chúng cũng thêm rất nhiều phức tạp vì một triển khai có thể có nhiều chuỗi thoát. Việc đọc và duy trì các chương trình rất phức tạp sẽ đơn giản hơn khi chúng sử dụng một tập hợp nhỏ các chiến lược thoát được xác định rõ, đánh máy, tạo ra và được xử lý bởi khách hàng. Trong các trường hợp khác, việc triển khai có thể theo thời gian thực hiện nhiều cú ném hơn hoặc sự phụ thuộc của chúng có thể giới thiệu chúng. Khách hàng không thể dễ dàng hoặc thích hợp bảo vệ chống lại tất cả những lối thoát này. Tôi viết và cập nhật rất nhiều thư viện, có sự phát triển và cải tiến thường xuyên. Cố gắng giữ cho tất cả đồng bộ với các chuỗi thoát ngoại lệ (trong một cơ sở mã lớn) sẽ không sử dụng tốt thời gian và có thể sẽ gây ra nhiều tiếng ồn và tiếng ồn. Do tính chính xác của chương trình tăng lên và nhiều bài kiểm tra hơn,

Lịch sử / Mã hiện tại

Trong một số trường hợp, chúng không bao giờ được giới thiệu vì lý do lịch sử. Một cơ sở mã hiện tại đã không sử dụng chúng, việc thay đổi các chương trình có thể mất nhiều năm và khiến nó thực sự xấu xí để duy trì vì sự chồng chéo trong các quy ước và triển khai.

Nhược điểm

Tất nhiên, có những nhược điểm, lớn nhất là: Tính không tương thích (bao gồm nhị phân) với các thư viện khác và thực tế là bạn sẽ phải triển khai một số lượng lớn các chương trình để phù hợp với mô hình này.


+1 thông tin tuyệt vời! (mặc dù tôi không đồng ý với đoạn Đơn giản)
Martin Ba

Sẽ rất thú vị nếu bạn chỉ có các nhà xây dựng không có lỗi và cách bạn xử lý phân bổ (- thất bại).
Martin Ba

@Martin 1) Không đồng ý là khá tốt. Tôi hiểu rằng hầu hết các nhà phát triển không đồng ý với việc vô hiệu hóa các ngoại lệ vì nhiều lý do. Để đơn giản, nó đi cùng với tính chính xác của chương trình. Vấn đề / trạng thái không hợp lệ chỉ đơn giản là không được phép đi xa. Điều đó có nghĩa là họ kiểm tra các thất bại và thoát ra một cách duyên dáng. bài viết của jheriko lặp lại điều này.
justin

1
Phân bổ @Martin 2b) phức tạp hơn một chút. Đầu tiên, số lượng phân bổ heap được giảm về số lượng và tăng kích thước - có tương đối ít phân bổ heap để bắt đầu. Thứ hai, phân bổ đi qua phân bổ tùy chỉnh. Nếu phân bổ ban đầu không được cung cấp cho người cấp phát (ví dụ malloctrả về 0), thì người cấp phát nhập vào một while (1)công cụ có chuyển đổi ngữ cảnh, tiếp theo là một nỗ lực khác trong phân bổ. Trong cơ sở mã này, nó đã từng là mới thông qua bộ cấp phát có thể trả về 0, nhưng việc triển khai mới hơn đã hoạt động tốt. (tiếp)
justin

2
có, có một trình bao bọc tương thích stl trên các giao diện cấp phát tùy chỉnh. về mặt kỹ thuật, chương trình sẽ không hủy bỏ khi phát hành; nó sẽ giới thiệu các chuyển đổi ngữ cảnh (ví dụ cho phép một luồng khác hoạt động, hy vọng sẽ giải phóng một số bộ nhớ), thử lại và đăng nhập nếu thất bại - mãi mãi. kiểm tra đơn vị có thể chạy trong nhiều ngày mà không có vấn đề. mối đe dọa thực sự duy nhất là phân bổ rất lớn, nhiều trong số đó sẽ bị bắt trước khi yêu cầu. một lần nữa, tỷ lệ thất bại của hệ thống cũng nằm trên radar vào thời điểm này; khả năng tồn tại là họ sẽ thất bại trước khi thực hiện cốt lõi trong một kịch bản như vậy.
justin

7

Google không chấp nhận các ngoại lệ trong Hướng dẫn về Phong cách C ++ của họ , chủ yếu là vì lý do lịch sử:

Trên mặt của họ, lợi ích của việc sử dụng các ngoại lệ lớn hơn chi phí, đặc biệt là trong các dự án mới. Tuy nhiên, đối với mã hiện có, việc đưa ra các ngoại lệ có ý nghĩa đối với tất cả các mã phụ thuộc. Nếu các ngoại lệ có thể được truyền ra ngoài một dự án mới, thì việc tích hợp dự án mới vào mã không có ngoại lệ hiện có cũng trở nên khó khăn. Bởi vì hầu hết mã C ++ hiện tại tại Google không được chuẩn bị để xử lý các ngoại lệ, nên việc áp dụng mã mới tạo ra ngoại lệ tương đối khó khăn.

Do mã hiện tại của Google không có ngoại lệ, chi phí sử dụng ngoại lệ có phần lớn hơn chi phí trong một dự án mới. Quá trình chuyển đổi sẽ chậm và dễ bị lỗi. Chúng tôi không tin rằng các giải pháp thay thế khả dụng cho các trường hợp ngoại lệ, chẳng hạn như mã lỗi và xác nhận, gây ra gánh nặng đáng kể.

Lời khuyên của chúng tôi chống lại việc sử dụng các ngoại lệ không được xác định dựa trên cơ sở triết học hoặc đạo đức, mà là những thực tiễn. Bởi vì chúng tôi muốn sử dụng các dự án nguồn mở của mình tại Google và thật khó để làm điều đó nếu các dự án đó sử dụng ngoại lệ, chúng tôi cũng cần tư vấn chống lại các ngoại lệ trong các dự án nguồn mở của Google. Mọi thứ có lẽ sẽ khác nếu chúng ta phải làm lại từ đầu.

Có một ngoại lệ cho quy tắc này (không có ý định chơi chữ) cho mã Windows.

(Nhấn mạnh của biên tập viên)


5

Qt gần như không bao giờ sử dụng ngoại lệ. Lỗi trong Qt được biểu thị bằng mã lỗi và tín hiệu. Lý do chính thức được nêu là:

Khi Qt được bắt đầu, ngoại lệ không có sẵn cho tất cả các trình biên dịch cần được Qt hỗ trợ. Hôm nay chúng tôi đang cố gắng giữ các API nhất quán, do đó, các mô-đun có lịch sử không sử dụng ngoại lệ thường sẽ không nhận được mã mới bằng cách sử dụng ngoại lệ được thêm vào.

Tại sao QT sử dụng rất ít ngoại lệ?

Ngày nay, một chỉ trích phổ biến của Qt là sự an toàn ngoại lệ của nó chưa hoàn tất.


1
Cảm ơn. Thông tin tốt, mặc dù tôi tự hỏi liệu hầu hết các cơ sở mã QT có thể có ngoại lệ được bật trong trình biên dịch không ...
Martin Ba

4

Symbian C ++ (được sử dụng trên một số điện thoại di động Nokia) không sử dụng ngoại lệ, ít nhất là không trực tiếp, vì trình biên dịch C ++ không đáng tin cậy thực hiện chúng khi Symbian được phát triển lần đầu tiên.


1
Điều này không giữ cho các phiên bản hiện đại của Symbian. Các TRAP và lá của Symbian được triển khai như các ngoại lệ C ++ thực sự , nhưng EPOC32 và các phiên bản cũ hơn của Symbian đã dựa vào các phương tiện khác (setjmp / longjmp nếu tôi nhớ chính xác).
otto

1
@OttoHarju: Đó là ý của tôi "ít nhất là không trực tiếp".
Keith Thompson

3

Tôi / không bao giờ / sử dụng ngoại lệ. Có một số lý do cho việc này, nhưng hai lý do chính là tôi chưa bao giờ cần chúng để tạo mã mạnh và chúng làm giảm hiệu suất khi chạy.

Tôi đã làm việc với mã sản xuất vừa sử dụng vừa vô hiệu hóa các ngoại lệ - mã cho phép ngoại lệ tệ hơn đồng đều. Ở một số nơi, các trường hợp ngoại lệ được sử dụng để kiểm soát luồng chính hãng thay vì xử lý lỗi, rất nặng, chống hiệu năng và khó gỡ lỗi. Nói chung, các vấn đề gỡ lỗi trong mã được điền ngoại lệ khó hơn so với mã không có ngoại lệ - một phần là do khó khăn và nội tại của cơ chế ngoại lệ, nhưng nhiều hơn là do mã lười được khuyến khích như một kết quả của việc xử lý ngoại lệ có sẵn.

Không có gì sai nghiêm trọng với bản thân ngoại lệ / nếu bạn không quan tâm đến hiệu suất / và không có thời gian để làm điều gì đó đúng đắn - chúng là một tính năng ngôn ngữ để xử lý lỗi và thay thế tốt cho cơ chế xử lý lỗi thích hợp. Tuy nhiên, hầu như luôn luôn có / tốt hơn / cách xử lý lỗi - như với logic của riêng bạn (thật khó để giải thích về điều này - đó là điều gần như thông thường). Nếu đó không phải là lỗi của bạn, nhưng xuất phát từ thư viện (ví dụ: thư viện chuẩn) thì bạn phải tôn trọng lựa chọn ngoại lệ hoặc có một số sự cố, nhưng tôi luôn đặt câu hỏi về sự lựa chọn đó. Tôi chưa bao giờ thấy một tình huống mà các ngoại lệ thực sự là giải pháp tốt nhất.

Các xác nhận có nhiều khả năng sửa lỗi hơn, mã lỗi ít nặng hơn ... giữa hai loại, nếu được sử dụng đúng cách, bạn sẽ dễ đọc, gỡ lỗi và duy trì mã nhanh hơn. Nó thắng tất cả các vòng ...


1
Không. Việc sử dụng sai các ngoại lệ sẽ dễ dàng hơn, nhưng các ngoại lệ đó hoạt động tốt. Ít nhất là dễ dàng để lý do, miễn là tất cả các chức năng của bạn đều an toàn ngoại lệ (và đó thường chỉ là vấn đề sử dụng RTTI cho tất cả các tài nguyên, dù sao bạn cũng nên làm). Làm mã lỗi đúng cách có thể cực kỳ tẻ nhạt và có thể dẫn đến việc chôn chương trình của bạn vào một đống mã xử lý lỗi; trong trường hợp đó, ngoại lệ là tốt hơn. Hãy nhớ rằng, việc tôi làm khác với bạn không phải là bằng chứng thuyết phục cho thấy tôi không quan tâm đến việc làm đúng.
David Thornley

... đối với lý do tại sao RTTI tệ, đó là một câu chuyện hoàn toàn khác - RTTI tích hợp trong mọi trình biên dịch mà tôi đã thấy là có thể đánh bại được - nếu bạn thậm chí cần RTTI. Mặc dù đó là tất cả về bối cảnh - những thứ như RTTI và ngoại lệ có thể tuyệt vời cho các ứng dụng RAD và doanh nghiệp - chúng không có chỗ trong thế giới điện toán hiệu năng cao (ví dụ như trò chơi). Tôi chưa bao giờ thấy một công cụ trò chơi sản xuất sử dụng bất kỳ mục tiêu nào mà chúng có thể bị tắt ...
jheriko

2
Xin lỗi - RAII là những gì tôi muốn nói. Nếu bạn không sử dụng nó, thì không chỉ có ngoại lệ sẽ bị rối tung. (Tuy nhiên, các diễn viên năng động hoạt động rất tốt trong công việc của tôi và tôi phải quan tâm đến hiệu suất.)
David Thornley

Chủ đề thú vị: Tôi nghĩ rằng các ngoại lệ cho phép mã hóa xử lý lỗi ngắn gọn hơn nhưng mã lỗi mạnh hơn vì chúng cho phép xử lý lỗi cục bộ (bạn có thể kiểm tra mã trả về ngay lập tức trong trình gọi trong khi ngoại lệ có thể làm nổi lên ngăn xếp cuộc gọi trước khi chúng bị bắt và đôi khi chúng không bị bắt, dẫn đến sự cố. Trừ khi bạn sử dụng lệnh bắt (...)).
Giorgio

3

Trong tiêu chuẩn mã hóa chung Strike Fighter C ++ của Bjarne et. al., ngoại lệ bị cấm, do yêu cầu thời gian thực cứng của máy bay chiến đấu.

JSF ++ dành cho các ứng dụng quan trọng về an toàn và thời gian thực (phần mềm điều khiển chuyến bay). Nếu một tính toán mất quá nhiều thời gian, ai đó có thể chết. Vì lý do đó, chúng tôi phải đảm bảo thời gian phản hồi và chúng tôi không thể - với mức hỗ trợ công cụ hiện tại - thực hiện điều đó cho các trường hợp ngoại lệ. Trong bối cảnh đó, thậm chí phân bổ cửa hàng miễn phí bị cấm! Trên thực tế, các đề xuất JSF ++ để xử lý lỗi mô phỏng việc sử dụng các ngoại lệ theo dự đoán của ngày mà chúng ta có các công cụ để thực hiện đúng, tức là sử dụng các ngoại lệ.

Trích dẫn từ Câu hỏi thường gặp về C ++ của Bjarne .

Hãy nhớ rằng, C ++ có thể chạy nhiều loại phần mềm nhất trong tất cả các ngôn ngữ ...


JSF ++ cũng cấm sử dụng "mới" (ngoài vị trí mới) và "xóa". Đó là một câu trả lời cho câu hỏi "làm thế nào để bạn xử lý thất bại mới mà không có ngoại lệ" của câu hỏi ...
armb

@armb: Vâng. Xem "Trong bối cảnh đó, thậm chí phân bổ cửa hàng miễn phí bị cấm!" ở trên.
Macke

2

Đó là loại quan trọng trong thiết kế thư viện C ++. Thông thường, với giao diện C, thật khó chịu khi ném ngoại lệ ra khỏi thư viện bên thứ 3 của bạn cho khách hàng. Điểm đáng chú ý là nếu thư viện của bạn ném, bạn sẽ loại bỏ một nhóm khách hàng đã sử dụng nó, với điều kiện là nó có bảo đảm không ném (vì bất kỳ lý do gì mà khách hàng bị hạn chế ngoại lệ).

Cá nhân tôi đã thấy các trường hợp ngoại lệ bị lạm dụng khi nhóm được yêu cầu "ném ngoại lệ" bất cứ khi nào điều gì đó không quá khủng khiếp xảy ra. Tất nhiên bạn thấy lỗi ở đây - ngoại lệ đã được ném vào mã trước khi bất kỳ ai tìm ra phải làm gì với nó. Dự án đó đã có một vài sự cố vì đôi khi những cú ném sâu này sẽ xuất hiện.


1

Có lẽ về vấn đề này, đáng nói đến Embedded C ++ . Embedded C ++ là một biến thể của C ++ được thiết kế (rõ ràng là đủ) cho các hệ thống nhúng. Về cơ bản, nó là một tập hợp con chính xác của C ++, với các mẫu (trong số những thứ khác), không gian tên và xử lý ngoại lệ được loại bỏ.

Tôi nên nói thêm rằng trong khi EC ++ tạo ra một chút giật gân khi nó còn mới, thì dường như chúng hầu như khá im ắng. Tôi không chắc liệu mọi người có mất hứng thú hay không, hoặc nỗ lực đầu tiên của họ chỉ đơn giản là hoàn hảo đến mức không ai thấy bất kỳ lý do nào để gây rối với nó trong một thập kỷ hoặc lâu hơn.<closed captioning for the humor impaired>Yeah, right!</closed captioning>


Tìm kiếm một câu hỏi và trả lời - caravan.net/ec2plus/question.html - Tôi muốn nói rằng nó đã chết khá nhiều.
Martin Ba

1

Một ví dụ điển hình là lập trình chế độ kernel.

Bạn có thể sử dụng C ++ ở đó cho mã sạch hơn nhưng không có ngoại lệ. Không có thư viện thời gian chạy cho chúng và xử lý ngoại lệ sử dụng quá nhiều bộ nhớ ngăn xếp rất hạn chế trong kernel (Tôi đã thử nghiệm các ngoại lệ C ++ trong nhân Windows NT và ném ngoại lệ và hủy bỏ một nửa ngăn xếp có sẵn - rất dễ bị tràn ngăn xếp và sụp đổ toàn bộ hệ thống).

Thông thường bạn xác định của riêng bạn newvà các deletenhà khai thác. Ngoài ra tôi thấy khá hữu ích một placement newtài liệu tham khảo rvalue a và c ++ 11. Không có STL hoặc các thư viện chế độ người dùng C ++ khác dựa trên các ngoại lệ có thể được sử dụng.


0

Khi bạn đang cố gắng để giữ bộ nhớ thực thi xuống. Thường được thực hiện trên các hệ thống nhúng (hoặc di động). Đối với các ứng dụng máy tính để bàn, nó không bao giờ cần thiết tuy nhiên trên các máy chủ, có thể xem xét nếu bạn muốn càng nhiều ram càng tốt cho máy chủ web hoặc cho sql.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.