Programowanie C++ - praktyka i szybki kod



C++ w praktyce:


Uwagi wstępne

Przykładowe pliki źródłowe testowane są głównie kompilatorami: i z rzadka na innych kompilatorach C++: gcc 2.7.2.f1, 2.8.0, 2.8.1, 2.91.6 egcs 1.1.1, 1.1.2, Digital C++ (SunOS, cxx), Visual C++ 4.0, 5.0. Kompatybilność z gcc niemal zawsze implikuje kompatybilność ze środowiskiem DJGPP/Cygwin/MINGW. Wszystkie testy przy najwyższych poziomach ostrzeżeń kompilatorów: i w zgodzie z aktualnym standardem języka: International Standard ISO/IEC 14882-1998(E) Programming languages - C++.
Dla przenaszalności nie używam typename, domyślnych argumentów wzorców. Dla wydajności unikam domyślnych argumentów funkcji, zliczania odniesień (ten wynalazek jest dla programistów systemowych którzy nie potrafią przekazywać argumentów przez referencje, a każdemu dodaje mały narzut czasowy), unikam w miarę możliwości wirtualiów. Nie używam RTTI, dynamic_cast<> świadczących częściej o złym projekcie niż dobrym implementatorze (są wyjątki). Utrzymuję wszystkie konwencje STL, dla łatwego przyswajania sobie kodu przez innych. Omijam iteratory. W zamian używam inteligentnych wskaźników (z kontrolą zakresu w czasie odpluskwiania!). Wyjątków używam tylko wyjątkowo rzadko i po zdefiniowaniu odpowiednich makr (_USE_ARRAY_EXCEPTIONS w l3_arrex.h). Wyłączenie obsługi wyjątków w kompilatorze pozostawia mój kod praktycznie tak samo bezpiecznym i równie użytecznym (a szybszym!). Kod ten jest 'exception safe' - gwarantowany brak wycieków zasobów w obecności wyjątków rzucanych przez typy parametryczne wzorców kontenerów.

Pozostają jeszcze do zbadania kompilatory: Comeau. Szczególnie ciekaw jestem testów na nietypowych platformach (48 bitowych?). Póki co .NET wykrywa problemy z przenośnością na 64 bity i się nie skarżył, a części kodu na 64 bitach uruchamiane były. Gdyby ktoś dla własnej ciekawości chciał tego dokonać osobiście proponuję skompilować i uruchomić l3_test.h z mojej biblioteki. W razie niezgodności powinny wyskoczyć jakieś brzydkie asercje (jest ich w moim kodzie mnóstwo).

Uwaga!

Często przydzielam ponad 64kb pamięci i zakładam że int jest co najmniej 32 bitowy (może być większy, pierwsze testy na 64 bitowym DECAlpha całkowicie bezproblemowe). Często używam wzorców. Pliki biblioteczne są maksymalnie niezależne, np. nie używają wspólnego pliku idiotycznych, nieprzenaszalnych definicji i rzadko włączają się wzajemnie. Ze względów wydajności programów nie używam wyjątków, klas i funkcji wirtualnych, stosuję parametry domyślne jedynie do naprawdę dużych funkcji. Wszystko to co programuję pomyślane jest jako szybsze od ewentualnej konkurencji. Wydajność programów jest głównym celem mojej twórczości, a nie kwiecistość stylu programowania i trywialne komentarze plus noty prawne w kodzie źródłowym, ani tym bardziej ikonki, myszki i buczki na każdym kroku.


Wszystkie programy publikowane na tej stronie napisałem osobiście, rzadko z użyciem koncepcji i algorytmów osób trzecich (co zaznaczono). Kody źródłowe i programy zamieszczone są tutaj w celach edukacyjno-poznawczych i w celu pochwalenia się moimi zdolnościami. Kody źródłowe chodzą i są dobrze napisane, lecz ich całość nie stanowi produktu i nie zobowiązuję się do opisywania co się w nich dzieje i dlaczego dla tych, którzy czegoś nie doczytali, jest to więc raczej zbiór użytecznych przykładów jak problemy można rozwiązywać. Kod ten jest chroniony prawem autorskim i nadużycie tych praw w celu osiągnięcia korzyści materialnych będzie ścigane i karane w maksymalnym zakresie przewidzianym przez prawo. All trademarks are trademarks and are owned by their owners.

Polecana bibliografia

Zainteresowanych i zielonych odsyłam do następujących książek, które były kamieniami milowymi w mojej programistycznej edukacji: Proszę mnie nie pytać gdzie je znaleźć.

Większość pozostałych publikacji (szczególnie tzw. biblie) to mniejsze lub większe wyciągi z tych właśnie pozycji.

Struktury danych i algorytmy

Dlaczego są lepsze sposoby na STL? I można przy tym zachować stary kod! Uwaga od eksperta (to ja, rzecz jasna): sposób zaprojektowania iteratorów w STL wyklucza napisanie dla nich kontroli zbyt dużego zakresu. Nie doczekają się Państwo nigdy stosownej biblioteki... Moja idea polega na używaniu własnych kontenerów, przenaszalnych i maksymalnie wydajnych z identyczną semantyką życia, nazwami metod i operatorami jak w Standard Template Library. Oznacza to łatwiejszą naukę i łatwiejsze łapanie błędów tak wcześnie jak to możliwe. Nazwy kontenerów są różne niż w STL i uzewnętrzniają nieco bardziej ich wewnętrzną implementację. Możliwe jest jednoczesne używanie moich własnych kontenerów i STL. Aby zrezygnować z używania biblioteki wystarczy kilkadziesiąt linii kodu w którym należy wyprowadzić klasy basearray od std::vector itd. według odpowiedników, zobacz l3_port.h.
Co ciekawe, pod eMbedded Visual 3.0 nie ma iostream i fstream, szczęśliwie dostarczam własną mini-implementację opartą na stdio. eMbedded Visual 3.0 nie ma też STL ale to jak można się domyślić nie jest dla mnie problemem bo właśnie masz przed sobą w 90% kompatybilny i bardziej przenośny zamiennik.

Symulacje w fizyce

Metody numeryczne

Algorytmy

Grafika i symulacje

Wybiórczy przegląd

kbosak@box43.pl