2010-04-08 4 views
7

Tôi hiện đang sử dụng C để tính toán số. Tôi đã nghe nói rằng bằng cách sử dụng C++ Expression Templates là tốt hơn cho máy tính khoa học. Mẫu biểu thức C++ trong các thuật ngữ đơn giản là gì?Mẫu biểu thức C++

  1. Có sách xung quanh thảo luận về các phương pháp/tính toán bằng cách sử dụng Mẫu biểu thức C++ không?

  2. Bằng cách nào, Mẫu biểu thức C++ tốt hơn sử dụng C thuần túy?

+0

Nếu bạn vẫn còn quan tâm đến cách biểu mẫu làm việc, Eigen (một Linear Al thư viện gebra) có tài liệu rất tốt về cách họ thực hiện chúng. –

Trả lời

11

Mẫu biểu thức C++ là gì?

Expression templates là danh mục lập trình meta mẫu C++, trì hoãn việc đánh giá các biểu thức con cho đến khi biểu thức đầy đủ được biết, để tối ưu hóa (đặc biệt là loại bỏ thời gian).

Có sách xung quanh thảo luận về các phương pháp/tính toán bằng cách sử dụng Mẫu biểu thức C++ không?

Tôi tin rằng ET's được phát minh bởi Todd Veldhuizen, người đã xuất bản một bài báo về nó cách đây 15 năm. (Có vẻ như nhiều liên kết cũ hơn đến nay đã chết, nhưng hiện tại here là phiên bản của nó.) Một số tài liệu về nó là trong các tác phẩm của David Vandevoorde và Nicolai Josuttis 'C++ Templates: The Complete Guide.

Bằng cách nào, Mẫu biểu thức C++ tốt hơn sử dụng thuần túy C?

Chúng cho phép bạn viết mã theo cách cấp cao biểu cảm mà không làm mất hiệu suất. Ví dụ,

void f(const my_array<double> a1, const my_array<double> a2) 
{ 
    my_array<double> a3 = 1.2 * a1 + a1 * a2; 
    // .. 
} 

có thể được tối ưu hóa tất cả các con đường xuống

for(my_array<double>::size_type idx=0; idx<a1.size(); ++idx) 
    a3[idx] = 1.2*a1[idx] + a1[idx]*a2[idx]; 

đó là nhanh hơn, nhưng khó hiểu.

+0

Tuyệt. Chúng ta có những thứ như vậy với tinh khiết C? – yCalleecharan

+0

Tôi hầu như không nghĩ như vậy, thấy rằng C không có mẫu, cũng không quá tải nhà điều hành. – visitor

+6

@yCalleecharan: Các mẫu biểu thức là tất cả về cách viết mã mức cao, trừu tượng và vẫn nhận được tối ưu hóa ở mức độ thấp.C không phải là ở tất cả về mức độ cao, mã trừu tượng, vì vậy yêu cầu về làm điều này trong C làm cho ít ý nghĩa như yêu cầu này trong lắp ráp. Tóm lại: Nếu bạn muốn có mức độ trừu tượng cấp cao và không bỏ qua tốc độ, hãy sử dụng C++. Nếu bạn chỉ muốn tốc độ và không quan tâm đến trừu tượng, hãy sử dụng C hoặc FORTRAN. Nếu bạn chỉ muốn trừu tượng cấp cao và không quan tâm đến tốc độ, hãy sử dụng một cái gì đó hoàn toàn khác. – sbi

3

Thêm vào câu trả lời của sbi, các mẫu biểu hiện triển khai cấp cao peephole optimizations sử dụng mẫu để khớp mẫu và tổng hợp.

Họ cũng thêm syntactic sugar hoặc làm cho mã của bạn dễ đọc hơn, bằng cách cho phép bạn chỉ định thuật toán về hoạt động đơn giản. Vì vậy, trong trường hợp này, đơn giản và thanh lịch đạt được thông qua tối ưu hóa bằng cách lập trình meta. Ít nhất, nếu bạn làm mọi thứ đúng.

+0

Cảm ơn bạn đã liên kết. – yCalleecharan

3

Có một bài viết tốt đẹp trên C++ template toán trong kho lưu trữ Flipcode cũ tốt (chắc chắn mang lại những kỷ niệm):

http://www.flipcode.com/archives/Faster_Vector_Math_Using_Templates.shtml

+0

Cảm ơn. Tôi sẽ đọc bài báo. Muốn có một cái gì đó tương tự cho tinh khiết C. – yCalleecharan

+0

Tại sao bạn sẽ muốn một cái gì đó như thế? Tại sao bạn tránh C++ mạnh mẽ như vậy? C có nghĩa là để được barebones và đơn giản, đơn giản, không có ý tưởng phức tạp. –

+0

Thông thường C được thi hành bởi các ràng buộc di sản hoặc hạn chế nền tảng. @yCalleecharan không tuyên bố của anh ta nhưng tôi đang cho rằng một phần phỏng đoán rằng phần còn lại của ứng dụng tính toán là C. [OT] Trong một ứng dụng là sự kết hợp giữa C và C++, tôi thường giới hạn bản thân mình với mã C trong phần di sản C vì vậy nó cảm thấy 'chính xác'. –