Hành vi do triển khai xác định và Hành vi không xác định
Tiêu chuẩn C ++ rất cụ thể về ảnh hưởng của các cấu trúc khác nhau, và đặc biệt là bạn phải luôn lưu ý các loại rắc rối sau:
Hành vi không xác định có nghĩa là hoàn toàn không có đảm bảo nào được đưa ra. Mã có thể hoạt động, hoặc nó có thể đốt cháy ổ cứng của bạn hoặc khiến ma quỷ bay ra khỏi mũi bạn . Đối với ngôn ngữ C ++, hoàn toàn có thể xảy ra bất cứ điều gì. Về mặt thực tế, điều này thường có nghĩa là bạn có một lỗi không thể khôi phục. Nếu điều này xảy ra, bạn không thể thực sự tin tưởng bất cứ điều gì về ứng dụng của mình (bởi vì một trong những tác động của hành vi không xác định này có thể chỉ là làm xáo trộn bộ nhớ được sử dụng bởi phần còn lại của ứng dụng của bạn). Nó không bắt buộc phải nhất quán, vì vậy chạy chương trình hai lần có thể cho kết quả khác nhau. Nó có thể phụ thuộc vào các giai đoạn của mặt trăng, màu sắc của chiếc áo bạn đang mặc hoặc bất cứ điều gì khác.
Hành vi không xác định có nghĩa là chương trình phải làm điều gì đó lành mạnh và nhất quán, nhưng nó không bắt buộc phải ghi lại điều này.
Hành vi được xác định bởi triển khai tương tự như hành vi không xác định, nhưng cũng phải được ghi lại bởi người viết trình biên dịch. Một ví dụ về điều này là kết quả của a reinterpret_cast
. thông thường , nó chỉ đơn giản là thay đổi kiểu của một con trỏ, mà không sửa đổi địa chỉ, nhưng ánh xạ thực sự được xác định bởi việc triển khai, vì vậy một trình biên dịch có thể ánh xạ tới một địa chỉ hoàn toàn khác, miễn là nó ghi lại lựa chọn này. Một ví dụ khác là kích thước của một int. Tiêu chuẩn C ++ không quan tâm nếu nó là 2, 4 hay 8 byte, nhưng nó phải được trình biên dịch ghi lại
Nhưng chung cho tất cả những điều này là chúng tốt nhất nên tránh. Khi có thể, hãy tuân thủ hành vi được chỉ định 100% bởi chính tiêu chuẩn C ++. Bằng cách đó, bạn được đảm bảo tính di động.
Bạn cũng thường phải dựa vào một số hành vi do triển khai xác định. Nó có thể không thể tránh khỏi, nhưng bạn vẫn nên chú ý đến nó và lưu ý rằng bạn đang dựa vào một cái gì đó có thể thay đổi giữa các trình biên dịch khác nhau.
Mặt khác, luôn luôn cần tránh những hành vi không xác định . Nói chung, bạn chỉ nên cho rằng nó làm cho chương trình của bạn bùng nổ theo cách này hay cách khác.