Podczas przeglądania bazy kodu Visual C++ znalazłem następujące dziwne rzeczy. Assert run-time (co jest sprawdzić stan i wyjątek, jeśli warunek jest łamane) został użyty w przypadku, gdy warunek może być oceniana w czasie kompilacji:Jakiś powód, aby użyć asercji podczas pracy zamiast asercji w czasie kompilacji?
assert(sizeof(SomeType) == sizeof(SomeOtherType));
wyraźnie kompilator oceni stan i zastąpić kod, który będzie skutecznie być
assert(true);
który nic nie robi lub
assert(false);
, który zgłasza wyjątek za każdym razem, gdy kontrola przechodzi przez tę linię.
IMO A assert kompilacji powinien być stosowany zamiast z następujących powodów:
- byłoby wystawiać naruszenie warunku wcześniej - w czasie kompilacji - i
- to niech czystsze (w ten sposób szybciej i mniejszy) kod maszynowy powinien być emitowany
Wygląda na to, że zapewnienie praw autorskich podczas kompilacji jest jedyną słuszną rzeczą. Czy jest jakikolwiek powód, aby preferować tu występowanie w czasie wykonywania?
Wygląda jak WTF dla mnie. – egrunin
'assert' zwykle nie rzuca wyjątku, ale raczej przerywa program. –
Na razie nie ma standardowego dowodu kompilacji. Ten fakt jest dość ważny, szczególnie w starszych bazach kodu. –