"Là gì như-nếu " quy tắc?
Quy tắc " as-if " về cơ bản xác định những chuyển đổi nào mà một triển khai được phép thực hiện trên một chương trình C ++ hợp pháp. Tóm lại, tất cả các phép biến đổi không ảnh hưởng đến " hành vi có thể quan sát được " của chương trình (xem định nghĩa chính xác bên dưới) đều được phép.
Mục đích là cho phép các triển khai tự do thực hiện tối ưu hóa miễn là hành vi của chương trình vẫn tuân thủ ngữ nghĩa được Chỉ định bởi Tiêu chuẩn C ++ về mặt máy trừu tượng.
Tiêu chuẩn đưa ra quy tắc này ở đâu?
Tiêu chuẩn C ++ 11 giới thiệu quy tắc " as-if " trong Đoạn 1.9 / 1:
Các mô tả ngữ nghĩa trong tiêu chuẩn này xác định một máy trừu tượng không xác định được tham số hóa. Tiêu chuẩn này không yêu cầu về cấu trúc của việc triển khai phù hợp. Đặc biệt, họ không cần sao chép hoặc mô phỏng cấu trúc của máy trừu tượng. Thay vào đó, các triển khai tuân thủ được yêu cầu để mô phỏng (chỉ) hành vi có thể quan sát được của máy trừu tượng như được giải thích bên dưới.
Ngoài ra, một chú thích giải thích cho biết thêm:
Quy định này đôi khi được gọi là quy tắc “nếu có” , bởi vì việc thực hiện có thể tự do bỏ qua bất kỳ yêu cầu nào của tiêu chuẩn này miễn là kết quả là như thể yêu cầu đã được tuân theo, chừng nào có thể xác định được từ hành vi quan sát được. của chương trình. Ví dụ, một triển khai thực tế không cần đánh giá một phần của biểu thức nếu nó có thể suy ra rằng giá trị của nó không được sử dụng và không có tác dụng phụ nào ảnh hưởng đến hành vi quan sát được của chương trình được tạo ra.
Quy tắc bắt buộc chính xác là gì?
Đoạn 1.9 / 5 chỉ rõ thêm:
Một triển khai tuân thủ thực hiện một chương trình được định dạng tốt sẽ tạo ra cùng một hành vi có thể quan sát được như một trong những thực thi có thể có của phiên bản tương ứng của máy trừu tượng với cùng một chương trình và cùng một đầu vào . Tuy nhiên, nếu bất kỳ quá trình thực hiện nào như vậy chứa một thao tác không xác định, thì tiêu chuẩn này không đặt ra yêu cầu đối với việc triển khai thực hiện chương trình đó với đầu vào đó (thậm chí không liên quan đến các thao tác trước thao tác không xác định đầu tiên).
Cần nhấn mạnh rằng ràng buộc này chỉ áp dụng khi "thực thi một chương trình đã được định dạng tốt" và các kết quả có thể có của việc thực thi một chương trình có chứa hành vi không xác định là không bị hạn chế. Điều này cũng được trình bày rõ ràng trong Đoạn 1.9 / 4:
Một số hoạt động khác được mô tả trong tiêu chuẩn này là không xác định (ví dụ, tác động của việc cố gắng sửa đổi đối tượng const). [Lưu ý: Tiêu chuẩn này không áp đặt yêu cầu đối với hoạt động của các chương trình có chứa hành vi không xác định . —Gửi ghi chú]
Cuối cùng, liên quan đến định nghĩa " hành vi có thể quan sát được ", Đoạn 1.9 / 8 trình bày như sau:
Các yêu cầu ít nhất đối với việc triển khai tuân thủ là:
- Quyền truy cập vào các đối tượng dễ bay hơi được đánh giá nghiêm ngặt theo các quy tắc của máy trừu tượng.
- Khi kết thúc chương trình, tất cả dữ liệu được ghi vào tệp phải giống với một trong những kết quả có thể có mà việc thực thi chương trình theo ngữ nghĩa trừu tượng sẽ tạo ra.
- Động lực đầu vào và đầu ra của các thiết bị tương tác phải diễn ra theo cách mà đầu ra nhắc nhở thực sự được phân phối trước khi chương trình đợi đầu vào. Những gì cấu thành một thiết bị tương tác được xác định bởi việc triển khai.
Chúng được gọi chung là hành vi quan sát được của chương trình . [ Lưu ý : Tương ứng nghiêm ngặt hơn giữa ngữ nghĩa trừu tượng và thực tế có thể được xác định bởi mỗi triển khai. - ghi chú cuối ]
Có những trường hợp nào mà quy tắc này không được áp dụng không?
Theo hiểu biết tốt nhất của tôi, ngoại lệ duy nhất đối với quy tắc " as-if " là sao chép / di chuyển elision, được phép mặc dù hàm tạo bản sao, hàm tạo di chuyển hoặc hàm hủy của một lớp có tác dụng phụ. Các điều kiện chính xác cho việc này được quy định trong Đoạn 12.8 / 31:
Khi đáp ứng một số tiêu chí nhất định, việc triển khai được phép bỏ qua việc sao chép / di chuyển cấu trúc của một đối tượng lớp, ngay cả khi hàm tạo được chọn cho hoạt động sao chép / di chuyển và / hoặc trình hủy cho đối tượng có tác dụng phụ . [...]