Trong khi xem xét codebase Visual C++ tôi tìm thấy một điều kỳ lạ sau đây. Một khẳng định thời gian chạy (mà là kiểm tra điều kiện và ném một ngoại lệ nếu tình trạng này bị vi phạm) được sử dụng trong trường hợp khi điều kiện này có thể được đánh giá ở thời gian biên dịch:Bất kỳ lý do nào để sử dụng xác nhận thời gian chạy thay vì xác nhận thời gian biên dịch?
assert(sizeof(SomeType) == sizeof(SomeOtherType));
rõ trình biên dịch sẽ đánh giá điều kiện và thay thế mã đó sẽ có hiệu quả là một trong hai
assert(true);
mà không làm gì hoặc
assert(false);
mà ném một ngoại lệ mỗi khi điều khiển đi qua dòng đó.
IMO một khẳng định thời gian biên dịch nên đã được sử dụng thay vì những lý do sau đây:
- nó sẽ phơi bày những vi phạm điều kiện trước đó - tại thời gian biên dịch - và
- nó sẽ cho phép bụi (do đó nhanh hơn và nhỏ hơn) mã máy được phát ra
Dường như xác nhận thời gian biên dịch là điều đúng duy nhất. Có lý do nào có thể để thích một xác nhận thời gian chạy ở đây không?
Có vẻ như một WTF cho tôi. – egrunin
'khẳng định' thường không ném ngoại lệ mà là hủy bỏ chương trình. –
Tính đến thời điểm này, không có xác nhận biên dịch chuẩn nào. Thực tế đó là khá quan trọng, đặc biệt là ở các cơ sở mã cũ hơn. –