2010-09-26 55 views
10

Trong C++ 98/C++ 03, không có pure/const function keywords trong ngôn ngữ.các hàm tinh khiết/const trong C++ 0x

  1. Điều này đã thay đổi trong C++ 0x chưa?

  2. Nếu có, có thể đặt cờ như vậy ngay cả trên các đối tượng chức năng (std::function) không? Vì vậy, tôi có thể vượt qua một số chức năng con trỏ hoặc chức năng lambda và bổ sung cung cấp cho các thông tin rằng nó là một chức năng tinh khiết/const? Hàm được gọi có thể có đường dẫn thực hiện được tối ưu hóa cho một hàm như vậy.

  3. Có cách nào để kiểm tra xem một hàm nhất định có phải là pure/const không? I E. ví dụ: nếu có cờ như vậy trên std::function như được mô tả ở trên, tôi có thể chỉ cần kiểm tra cờ đó. Nhưng có lẽ thậm chí còn có một cách tổng quát hơn.

Nếu nó không thay đổi, tại sao không? Tôi nghĩ rằng nó có thể khá hữu ích để có một sự hỗ trợ như vậy.

Có đề xuất mở nào về nó không?

+0

Tôi đang cố gắng xóa thẻ [tag: pure] - [xem meta] (http://meta.stackexchange.com/questions/171779/what-is-the-pure-tag- cho) để biết thêm thông tin. Tôi không biết nhiều về [tag: C++], vì vậy tôi có thể hỏi lời khuyên của bạn về các thẻ khác để sử dụng cho câu hỏi này và các câu hỏi giống như nó, về 'pure/const'? –

Trả lời

8
  1. Điều này đã thay đổi trong C++ 0x chưa?

No. Không có constexpr nhưng nó có nghĩa là hằng số biên dịch. Nếu các tham số của nó là constexprs thì nó được thực hiện tại thời gian biên dịch, nhưng đó là một hàm bình thường nếu không. Vì chúng phải được định nghĩa trong cùng một đơn vị dịch và bao gồm một câu lệnh trả về duy nhất, chúng có thể sẽ được inlined và tối ưu hóa ở trên sẽ được thực hiện. Nó không thể được sử dụng để cung cấp thông tin trình biên dịch về hàm liên kết bên ngoài.

Nếu nó không thay đổi, tại sao không? Tôi nghĩ rằng nó có thể khá hữu ích để có một sự hỗ trợ như vậy.

Thực ra tôi không nghĩ bạn cần. Ngôn ngữ đã quá lớn và lập trình viên có thể dễ dàng viết lại mã này để có hiệu quả hơn dựa trên kiến ​​thức của mình. Không giống như restrict, nó không cung cấp bất kỳ thông tin nào không thể được thể hiện bằng các phương tiện khác.

Có đề xuất mở nào về nó không?

Tôi chưa thấy bất kỳ giấy tờ ủy ban nào về chủ đề đó.

+0

Cảm ơn thông tin. Nhưng tinh khiết/const thực sự sẽ cung cấp thêm thông tin có thể trong một số trường hợp rất phức tạp/chủ yếu là không thể diễn tả khác. Trình biên dịch thậm chí có thể thêm ghi nhớ chỉ trong suốt. – Albert

+1

@Albert: Tự động ghi nhớ có thể không xảy ra trong C++. Tuy nhiên, bạn có thể thêm nó vào các chức năng của riêng bạn. Ví dụ, xây dựng trên 'std :: function ', có thể tạo 'my_memoized_function '. – Potatoswatter

+1

@Albert: nhưng bạn chỉ có thể thực hiện ghi nhớ, do đó, một lần nữa, không có gì không thể được diễn tả bằng cách khác. – jalf

6

gcc sử dụng __attribute__((<attr>)) để xác định extra attributes trên các hàm.

  • tinh khiết: chỉ truy cập (nhưng không sửa đổi) các thông số và bộ nhớ toàn cầu. GCC sử dụng thông tin này để xác định xem trình tối ưu hóa có thể bỏ qua hoàn toàn các cuộc gọi lặp lại tới hàm (ghi nhớ cục bộ) hay không. Hai hàm thuần túy đáng chú ý là strlenmemcmp.

  • const: không được nhầm lẫn với C++ const, hàm const chỉ truy cập thông số và các tham số đó không được là con trỏ.Về cơ bản, đây là phiên bản giới hạn hơn của pure. Trình tối ưu hóa xử lý các hàm const tương tự như pure. Mặc dù về mặt lý thuyết, nó có thể thực hiện ghi nhớ tích cực hơn (không phải địa phương) hơn là cho pure.

Cú pháp thuộc tính mới của C++ 11 (§7.6) được thiết kế để làm việc này. Hiện tại bạn không thể sử dụng cú pháp thuộc tính của C++ để thiết lập các thuộc tính GCC, nhưng điều đó sẽ thay đổi trong các phiên bản gcc trong tương lai.

Vì vậy, bạn sẽ có thể gán thuộc tính pure cho các hàm sử dụng cú pháp thuộc tính. Nhưng không có thuộc tính tiêu chuẩn pure. tinh khiết sẽ được trình biên dịch cụ thể, nhưng nó sẽ làm điều đúng trên gcc.

Đối với người hiếu, đây là danh sách các thuộc tính tiêu chuẩn:

  • class
  • noreturn
  • override
  • ẩn
  • base_check
  • carries_depend ency
+0

Vẫn còn thuộc tính "ghi đè", ngay cả bây giờ C++ 11 có từ khoá 'ghi đè' rõ ràng? – snogglethorpe

+0

'ghi đè',' base_check' và 'ẩn' được cuộn vào từ khóa' ghi đè '. –