Mặc dù câu hỏi cũ của tôi tôi muốn thêm 5cents của tôi ở đây, vì tôi có lẽ không phải là người duy nhất tìm thấy câu hỏi này thông qua công cụ tìm kiếm.
tôi không thể nhận xét về tốc độ biên dịch nhưng trên thực hiện tốc độ:
Để theo sự hiểu biết của tôi, chỉ có một tính năng trong C++ mà chi phí hoạt động, ngay cả khi bạn không sử dụng nó. Tính năng này là ngoại lệ C++, bởi vì chúng ngăn cản một số tối ưu hóa trình biên dịch (đó là lý do, tại sao noexcept
được giới thiệu trong C++ 11). Tuy nhiên, nếu bạn sử dụng một số loại cơ chế kiểm tra lỗi, thì ngoại lệ có thể hiệu quả hơn so với kết hợp kiểm tra giá trị trả về và một câu lệnh if else
lô. Điều này đặc biệt đúng, nếu bạn phải báo cáo lỗi lên ngăn xếp.
Dù sao, nếu bạn tắt ngoại lệ trong khi biên dịch, C++ không giới thiệu chi phí, ngoại trừ những nơi bạn cố tình sử dụng các tính năng liên quan (ví dụ: bạn không phải trả tiền cho đa hình nếu bạn không sử dụng chức năng ảo), trong khi hầu hết các tính năng đều không giới thiệu chi phí thời gian chạy (quá tải, mẫu, không gian tên aso). Mặt khác, hầu hết các dạng mã chung sẽ nhanh hơn nhiều trong C++ so với c tương đương, vì C++ cung cấp các cơ chế (mẫu và lớp) dựng sẵn để thực hiện điều này. Một ví dụ điển hình là csort vs C++'s std :: sort. Phiên bản C++ thường nhanh hơn nhiều, bởi vì bên trong sắp xếp, hàm so sánh được sử dụng được biết ở thời gian biên dịch, ít nhất là lưu một cuộc gọi thông qua tra cứu hàm và trong trường hợp tốt nhất cho phép tối ưu hóa thêm nhiều trình biên dịch.
Điều đó đang được nói, "vấn đề" với C++ là dễ ẩn giấu sự phức tạp của người dùng sao cho mã dường như vô tội có thể chậm hơn nhiều so với dự kiến. Điều này chủ yếu là do quá tải nhà điều hành, đa hình và constructors/destructors, nhưng ngay cả một cuộc gọi đơn giản đến một chức năng thành viên ẩn các this
-con trỏ mà cũng không phải là một NOP. Xem xét quá tải của toán tử: Khi bạn thấy *
trong c, bạn biết điều này là (trên hầu hết các kiến trúc) một hướng dẫn lắp ráp đơn, rẻ, trong C++ mặt khác nó có thể là một cuộc gọi hàm phức tạp (suy nghĩ về phép nhân ma trận). Điều đó không có nghĩa là, bạn có thể thực hiện cùng một chức năng trong c bất kỳ nhanh hơn nhưng trong C++ bạn không trực tiếp thấy rằng đây có thể là một hoạt động tốn kém. Destructors là một trường hợp tương tự: Trong "C++" hiện đại, bạn hầu như không thấy bất kỳ sự phá hủy rõ ràng nào thông qua xóa nhưng bất kỳ biến cục bộ nào nằm ngoài phạm vi có khả năng kích hoạt một cuộc gọi đắt tiền tới một destructor ảo. điều này (bỏ qua }
tất nhiên). Và cuối cùng, một số người (đặc biệt đến từ Java) có xu hướng viết các phân cấp lớp phức tạp với nhiều chức năng ảo, trong đó mỗi cuộc gọi đến một hàm như vậy là một cuộc gọi hàm gián tiếp ẩn, khó hoặc không thể tối ưu. Vì vậy, trong khi ẩn phức tạp từ lập trình viên nói chung là một điều tốt đôi khi nó có ảnh hưởng xấu đến thời gian chạy, nếu lập trình viên không nhận thức được chi phí của các cấu trúc "dễ sử dụng" này.
Như một bản tóm tắt tôi sẽ nói, C++ giúp các lập trình viên thiếu kinh nghiệm viết mã chậm dễ dàng hơn (vì họ không thấy sự thiếu hiệu quả trong chương trình). Nhưng C++ cũng cho phép các lập trình viên giỏi viết mã "tốt", chính xác và nhanh hơn so với c - điều này cho phép họ có thêm thời gian để suy nghĩ về tối ưu hóa khi chúng thực sự cần thiết.
P.S .:
Hai điều tôi chưa đề cập (có thể là những thứ khác mà tôi đã quên) là khả năng tính toán thời gian biên dịch phức tạp (nhờ mẫu và constexpr) và từ khóa hạn chế của C++. Điều này là bởi vì đã không sử dụng một trong số họ trong các chương trình quan trọng thời gian nào được nêu ra và vì vậy tôi không thể bình luận về tính hữu ích chung của họ và lợi ích hiệu suất thế giới thực.
Tôi cho rằng một tìm kiếm nhỏ của Google sẽ cung cấp cho hàng nghìn lượt truy cập về chủ đề này, bao gồm nhiều bài tiểu luận và tài liệu nghiên cứu. – Lundin
@Lundin: Tôi tìm kiếm SO vì có một nhóm chuyên gia tuyệt vời đưa ra lời khuyên và khuyến nghị có giá trị dựa trên kinh nghiệm cá nhân và chuyên môn của họ. Sẽ không có việc sử dụng SO nếu người ta phải google và đọc hàng chục và hàng ngàn bài tiểu luận thay vì được hưởng lợi từ kinh nghiệm của các lập trình viên chuyên gia đồng nghiệp. –
Sự cố với câu hỏi này là "cùng một chương trình trong C". Vấn đề là việc thực hiện một cách ngây thơ cùng một chương trình trong C không cung cấp cho bạn cùng một chương trình. Trình biên dịch C++ tạo ra nhiều mã hơn mà bạn không thực sự thấy rằng trình lập trình "C" nên thực hiện để làm cho các chương trình giống nhau. Vì vậy, bạn nên thêm một biện pháp chủ quan thứ ba để kiểm tra của bạn. Mất bao lâu để 'viết' một chương trình C++/C tương đương. Với một ứng dụng không tầm thường tôi nghi ngờ rằng sự khác biệt là đáng kể. –