Đối với "đầu tiên" - y
phải được truy cập, khi z
được khởi tạo, nhưng tôi không nghĩ rằng kết quả của việc tiếp cận này phải được sử dụng để tính toán z
, nếu thực hiện bằng cách nào đó biết rằng nó phải là 2. Đối với chương trình này có (tôi nghĩ) chỉ có 2 cách có thể có bất kỳ giá trị nào khác:
- nó được sửa đổi bởi trình gỡ rối hoặc sự can thiệp khác với chương trình.
- bộ nạp đặt các hình cầu dễ bay hơi ở một số vùng bộ nhớ không hoạt động như bộ nhớ thông thường trên phần cứng của bạn. (trong trường hợp này thực sự là hành vi được xác định rất kỳ quặc, đến mức tôi không nghĩ nó hợp pháp đối với mã như đã viết, nhưng nó có liên quan nếu chương trình, hoặc một phần nào đó của quá trình xây dựng bên ngoài chương trình, có thể bằng cách nào đó kiểm soát nơi đối tượng kết thúc).
Cả hai điều đó là việc thực hiện có thể loại trừ - trong trường hợp thứ hai bằng cách biết cách trình nạp hoạt động, ngay từ đầu bằng cách đặt giới hạn cho những gì bạn có thể đạt được với trình gỡ lỗi ("viết dễ bay hơi biến kết quả trong hành vi đáng ngạc nhiên "). Thất vọng cho người dùng của trình gỡ rối, nhưng tiêu chuẩn không hạn chế cách các trình gỡ rối hoạt động, hoặc bộ nhớ "thực sự" có chứa gì, nó chỉ hạn chế những triển khai và chương trình C++ hợp lệ, và những gì C++ "thấy".
Trong thực tế, bạn nghĩ rằng trình biên dịch sẽ không bận tâm xử lý một đối tượng dễ bay hơi như tùy thuộc vào tối ưu hóa. Đó là một đối tượng không phải const, và bạn phải nghi ngờ rằng lý do duy nhất để định nghĩa một đối tượng dễ bay hơi không phải là const vì nó sẽ thay đổi theo cách mà trình biên dịch không mong đợi [*]. Bạn hy vọng nó sẽ chỉ đọc y
và làm việc phân chia, nhưng tôi nghĩ một trường hợp có thể được thực hiện để tối ưu hóa là hợp pháp. Đối với "thứ hai" - trong trường hợp chương trình của bạn, trình biên dịch có thể khởi tạo d
với giá trị được tính trước theo quy tắc "as-if", miễn là nó biết phân chia giá trị nào tạo ra. Đối với vấn đề đó trong chương trình của bạn, nó có thể xóa hoàn toàn d
.
"Miễn là phân chia giá trị sản xuất" phụ thuộc vào việc thực hiện - nếu nó hỗ trợ thay đổi chế độ làm tròn IEEE hoặc tương đương, và nếu nó không biết chế độ nào sẽ có hiệu lực, biết trước kết quả của số học đơn giản.
Quy tắc "as-if" bao gồm 85% tối ưu hóa trình biên dịch. Nó được đề cập trong phần 1.9 của tiêu chuẩn, đáng xem. Tôi đồng ý rằng tài liệu nói chung là khá đáng sợ và ngôn ngữ sử dụng đôi khi không thể hiểu được, nhưng bạn phải bắt đầu từ đâu đó, vì vậy hãy bắt đầu với bất kỳ điều gì bạn quan tâm ;-)
[*] Cụ thể, và đây không phải là điều được đề cập trong tiêu chuẩn C++ 03 theo bất kỳ cách nào, một số trình biên dịch (Microsoft) liên quan đến volatile
trong định nghĩa của chúng về ngữ nghĩa luồng.
Nguồn
2010-10-02 13:42:09
Vì bạn đã làm nó cho x, tại sao bạn không kiểm tra những gì các hướng dẫn lắp ráp cho d = 7/3? –
@Emile Cormier: Nó liên quan đến lệnh fld và fstp. Tôi không thể hiểu nhiều, mặc dù tôi vẫn chưa từ bỏ – Nivhus
Btw, trong mã này d == 2, đó là phân chia số nguyên. – ybungalobill