DWORD dwNieużyw:23;
};
#ifdef _DEBUG
char szAsercjaStałyRozm[sizeof(DWORD)-sizeof(StałyRozm)+1];
#endif //DEBUG
Często zależy nam na tym, aby rozmiar struktury lub klasy mieścił się w pewnym określonym zakresie. Moglibyśmy na przykład utworzyć klasę węzłów w drzewie lub w innej strukturze danych i upewnić się, że rozmiar węzłów mieści się w pewnej wielkości albo w celu ich wyrównywania albo w celu zapewnienia, że zużycie pamięci nie jest zbyt duże. We fragmencie „Przed” utworzyliśmy strukturę o rozmiarze DWORD. Planujemy przydzielenie kilkuset tysięcy egzemplarzy tej struktury, więc chcemy się upewnić, że struktura nie przekroczy rozmiaru typu DWORD po dodaniu kilka pól bitowych lub składowych.
Po policzeniu liczby bitów widzimy jednak, że popełniliśmy błąd, wybierając rozmiar pola dwNieużyw. Cała struktura ma 33 bity, czyli więcej niż rozmiar typu DWORD (32 bity). Nawet jeśli nasz komentarz mówi nam, że sprytnie zdefiniowaliśmy naszą strukturę, to jednak mamy w niej błąd.
We fragmencie „Po” przekroczenie rozmiaru jest wykrywane za pomocą pewnej sztuczki. Przydzielamy pamięć dla tablicy o liczbie elementów równej rozmiarowi wymaganej struktury zmniejszonej o rzeczywisty rozmiar struktury. Jeśli tworzona struktura przekracza wymagany rozmiar, wówczas jest przydzielana tablica o niedodatnim rozmiarze. (W naszym przykładzie funkcja sizeof(StałyRozm) zwraca wartość 5, więc 4-5+l=0.) Powoduje to błąd kompilacji. Jeśli zaś tworzona struktura mieści się w wymaganym rozmiarze, to alokowana tablica ma długość dodatnią i nie otrzymujemy błędu.
Zauważmy, że sprawdzenie to jest wykonywane tylko w trakcie kompilacji testowej, dzięki czemu nie dołączamy tworzonej tablicy do ostatecznej wersji kodu.
Przykład: klasa FixedSize w pliku regexp.cpp
unikanie awarii; unikanie nieoczekiwanych wyników
Przed
public:
uKlasa() : nldNaucz(O), fltPensja(0.)