Przejdź do głównej zawartości

Posty

Wyświetlanie postów z grudzień, 2012

Metaprogramowanie cz2 – polimorfizm inaczej

Jak działa polimorfizm wie każdy programista języka C++ jest to przecież najpopularniejsza cech programowania obiektowego. Za pomocą funkcji wirtualnych, klas abstrakcyjnych jesteśmy w stanie tworzyć kod ogólny, bazując jedynie na interfejsach, zrzucając jednocześnie sposób rozwiązania na klasy pochodne dostarczające implementację. Wszystko pięknie ładnie i elastycznie. Niestety funkcje wirtualne są najzwyczajniej w świecie wolne. Jak wiadomo są miejsca w każdym dużym projekcie które wymagają minimalizacji opóźnień. Czy w tych miejscach należy zatem rezygnować z polimorfizmu i oferowanej przez niego elastyczności na rzecz maksymalizacji czasu działania kodu? Na szczęście są sposoby na obejście tego problemu, z pomocą przychodzą nam jak zwykle szablony. Zacznijmy od zaprezentowania szablonu który w pozwala na zdefiniowanie typu na podstawie wartości (więcej szczegółów na ten temat można znaleźć w Nowoczesne projektowanie w C++. Uogólnione implementacje wzorców projektowych ). te

C++ metaprogramowanie z wykorzystaniem szablonów cz. 1

Ten wpis rozpoczyna cykl dotyczący metaprogramowania, ilość oraz częstotliwość publikacji kolejnych części pozostaje nieustalona. Poniżej zaprezentowane zostanie absolutny elementarz, czyli wyznaczanie dowolnego elementów wyrazu ciągu Fibonacciego w czasie kompilacji. #include <iostream> template<unsigned int N> struct Fib {   static const unsigned int el = Fib<N-1>::el + Fib<N-2>::el; }; template<> struct Fib<0> {   static const unsigned int el = 0; }; template<> struct Fib<1> {   static const unsigned int el = 1; }; int main(void) {   const unsigned int N = 5;   std::cout << "fib( " << N << " ) = " << Fib<N>::el << std::endl;   return 0; } Tych parę linijek zmusza do wyliczenia 5 elementu ciągu Fibonacciego kompilator, co oznacza że jedynymi instrukcjami jakie zostaną wykonane przez nasz program po sko

Makra i preprocesor

Jako programista klasycznego C przyszło mi wielokrotnie ścierać się z makrami. Makro to zestaw instrukcji umieszczanych w kodzie są jednak interpretowane nie przez kompilator ale przez preprocesor. Preprocesor jest „pomocnikiem” kompilatora, zajmuje się on np. wstawianiem treści plików nagłówkowych do plików z kodem za pomocą instrukcji #include. Preprocesor należy rozumieć jako prymitywny edytor tekstu dokonujący „korekcji” plików z kodem źródłowym przed rozpoczęciem ich przetwarzania przez kompilator. Jakie są zalety wykorzystywania tych rozwiązań w kodzie? Tak naprawdę w języku C w czasach przed wprowadzeniem słowa kluczowego inline umożliwiały wstawianie kodu we wskazane miejsce. Należy bowiem pamiętać że każdorazowe wstawienie makroinstrukcji powoduje ingerencję w kod źródłowy (innymi słowy we wskazanym miejscu zostanie wstawiony stosowny fragment kodu). Łatwo obserwowalnym efektem częstego wykorzystywania makr w plikach z kodem jest rozrost pliku binarnego oraz jego szybsze d