c++ wyk‚ad 11 (30.05.2013)

Download C++ wyk‚ad 11 (30.05.2013)

Post on 19-Mar-2016

49 views

Category:

Documents

1 download

Embed Size (px)

DESCRIPTION

C++ wykład 11 (30.05.2013). Własne biblioteki, standardowa biblioteka szablonów STL. Kompilacja i łączenie. Plik jako jednostka kompilacji. Preprocesing – obsługa makr i dyrektyw włączających – dostarcza kompilatorowi jednostkę translacji. - PowerPoint PPT Presentation

TRANSCRIPT

  • C++wykad 11 (30.05.2013)Wasne biblioteki, standardowa biblioteka szablonw STL

  • Kompilacja i czeniePlik jako jednostka kompilacji.Preprocesing obsuga makr i dyrektyw wczajcych dostarcza kompilatorowi jednostk translacji.Kompilator analizuje jednostk translacji w izolacji od reszty programu.Fizyczna struktura programu (podzia na pliki) powinna wynika z logicznej struktury programu.Rola linkera przy budowaniu programu albo biblioteki.

  • ModuyKady wikszy program skada si z pewnej liczby oddzielnych czci moduw.Modu to kompletny fragment programu (modu obliczeniowy, modu we/wy, modu prezentacji, itp).Podzia kodu na moduy porzdkuje logik programu.Naley minimalizowa zalenoci midzy moduami.

  • BibliotekiModuy, z ktrych moe korzysta wiele programw umieszcza si w oddzielnych skompilowanych plikach, zwanych bibliotekami.Typy bibliotek w C++: biblioteka statyczna jest doczana do programu wynikowego na etapie linkowania;biblioteka wspdzielona jest doczana do programu w trakcie adowania programu do pamici;biblioteka dynamiczna jest doczana do uruchomionego procesu w trakcie dziaania programu.

  • BibliotekiBiblioteka to zbir klas, funkcji i zmiennych, z ktrych mog korzysta rne programy.Biblioteka ma posta binarn jej poszczeglne fragmenty s skompilowane (biblioteka jest kolekcj plikw obiektowych).Korzystanie z bibliotek uatwia programowanie (korzystamy z gotowych i sprawdzonych fragmentw kodu) i przyspiesza proces rekompilacji.

  • BibliotekiWynikiem samej kompilacji pliku rdowego (plik.c albo plik.cpp) jest plik plik.o pod Linuxem albo plik.obj pod Windowsem.Biblioteki statyczne maj nazwy libmodul.a pod Linuxem albo modul.lib pod Windowsem.Biblioteki dynamiczne maj nazwy libmodul.so pod Linuxem (tak jak biblioteki wspdzielone) albo modul.dll pod Windowsem.

  • Biblioteka statycznaUywajc biblioteki statycznej przekazujemy jej archiwum linkerowi w czasie kompilacji. Linker wyszukuje w nim tylko tych plikw obiektowych, ktre s niezbdne do dziaania naszego programu i kopiuje je bezporednio do programu.Program wynikowy korzystajcy z biblioteki statycznej jest obszerniejszy ale szybciej si aduje do pamici.Program wynikowy zlinkowany z bibliotek statyczn jest niezaleny od plikw zewntrznych.Uaktualnienie biblioteki wymaga rekompilacji programu.

  • Biblioteka statycznalib.cpplib.ostatic libraryprog.cppprog.oa.outmemorylinkerloaderg++arg++g++ssh

  • Biblioteka wspdzielonaProgramy korzystajce biblioteki wspdzielonej nie zawieraj bezporednio kodu z tej biblioteki a tylko referencj do niej.Program wynikowy korzystajcy z biblioteki wspdzielonej jest chudszy ale wolniej aduje si do pamici (biblioteki wspdzielone s odszukiwane i adowane do pamici razem z programem).Program wynikowy skompilowany z bibliotek wspdzielon jest zaleny od plikw zewntrznych.Zmodyfikowanie biblioteki wspdzielonej spowoduje zmian w dziaaniu programu ale bez jego ponownej kompilacji.

  • Biblioteka wspdzielonalib.cpplib.oshared libraryprog.cppprog.oa.outmemorylinkerloaderg++g++g++g++ssh

  • Biblioteka dynamicznaProgramy korzystajce bibliotek dynamicznych nie zawieraj bezporednio kodu z tej biblioteki ale musz korzysta ze specjalnych metod wczania takich bibliotek w trakcie dziaania programu (plik nagwkowy ). Program wynikowy korzystajcy z biblioteki dynamicznej jest chudszy i szybciej aduje si do pamici, ale dziaa wolniej (biblioteki dynamiczne mona zaadowa w dowolnym momencie w trakcie dziaania programu).Program wynikowy skompilowany z bibliotek dynamiczn jest zaleny od plikw zewntrznych.Zmodyfikowanie biblioteki dynamicznej spowoduje zmian w dziaaniu programu ale bez jego ponownej kompilacji.

  • Biblioteka dynamicznalib.cpplib.odynamic libraryprog.cppprog.oa.outmemorylinkerloaderg++g++g++g++ssha.out

  • Tworzenie bibliotek (pod Linuxem)Tworzenie programu bez doczanych bibliotek. Zamy, e mamy pliki src1.cpp, src2.cpp i src3.cpp, ktre stanowi modu obliczeniowy oraz plik prog.cpp, ktry bdzie korzysta z funkcji i klas zdefiniowanych w module obliczeniowym.Aby skompilowa cay program razem z moduem obliczeniowym naley wyda polecenie: $ g++ -Wall -ansi -pedantic src1.cpp src2.cpp src3.cpp prog.cpp -o calculationAby skompilowa cay program razem z moduem obliczeniowym i statycznie zlinkowa z innymi bibliotekami (rozmiar programu wynikowego bdzie znacznie wikszy) naley wyda polecenie: $ g++ -static Aby uruchomi skompilowany program naley wyda polecenie: $ ./calculationAby sprawdzi z jakimi bibliotekami jest linkowany program i jakie symbole s w nim uyte naley wyda polecenie: $ ldd calculation $ nm calculation

  • Tworzenie bibliotek (pod Linuxem)Program korzystajcy z biblioteki statycznej. Najpierw kompilujemy pliki rdowe do plikw obiektowych: $ g++ -c -Wall -ansi -pedantic src1.cpp src2.cpp src3.cpp Nastpnie czymy pliki obiektowe do jednego pliku bibliotecznego libsrc.a: $ ar crs libsrc.a src1.o src2.o src3.o Na koniec naley skompilowa plik z programem i zlinkowa go z bibliotek: $ g++ -c -Wall -ansi -pedantic prog.cpp $ g++ -o calculation prog.o L. lsrcTeraz mona uruchomi skompilowany program: $ ./calculationWyjanienie: opcja -Lcieka okrela ciek do biblioteki, opcja -lbiblioteka okrela nazw biblioteki.

  • Tworzenie bibliotek (pod Linuxem)Program korzystajcy z biblioteki wspdzielonej. Najpierw kompilujemy pliki rdowe z opcj -fpic do plikw obiektowych: $ g++ -fpic c -Wall -ansi -pedantic src1.cpp src2.cpp src3.cpp Nastpnie czymy pliki obiektowe do jednego pliku bibliotecznego libsrc.so: $ g++ fpic -shared -o libsrc.so src1.o src2.o src3.o Na koniec naley skompilowa plik z programem i wlinkowa do niego informacje o bibliotece: $ g++ -Wall -ansi -pedantic prog.cpp $ g++ -o calculation prog.o L. lsrcPrzed uruchomieniem programu trzeba zapisa w zmiennej rodowiskowej LD_LIBRARY_PATH ciek do biblioteki: $ export LD_LIBRARY_PATH="LD_LIBRARY_PATH:cieka"Teraz mona uruchomi skompilowany program: $ ./calculation

  • Tworzenie bibliotek (pod Linuxem)Program korzystajcy z biblioteki dynamicznej. Bibliotek dynamiczn przygotowujemy tak samo jak bibliotek wspdzielon libsrc.so: $ g++ -fpic c -Wall -ansi -pedantic src1.cpp src2.cpp src3.cpp $ g++ fpic -shared -o libsrc.so src1.o src2.o src3.o Na koniec naley skompilowa plik z programem i doczy do niego dynamicznego linkera opcj -ldl: $ g++ -Wall -ansi -pedantic prog.cpp $ g++ -o calculation prog.o ldlTeraz mona uruchomi skompilowany program: $ ./calculationWyjanienie: aby skorzysta z dynamicznego linkera naley do programu wczy plik nagwkowy ; aby zaadowa dynamiczn bibliotek trzeba skorzysta z funkcji dlopen, dlsym, dlerror i dlclose.

  • Nazwy zewntrzneNazwa jest czona zewntrznie jeli mona jej uywa w jednostkach translacji innej ni ta, w ktrej j zdefiniowano.Nazw zewntrzn deklaruje si za pomoc sowa extern.Funkcja wbudowana musi by zdefiniowana w kadej jednostce translacji za pomoc identycznej definicji; ta sama reua odnosi si do funkcji i klas szablonowych.

  • Nowoci z C++11 szablony zewntrzne i aliasy szablonwC++ musi stworzy instancj szablonu zawsze kiedy napotka w peni okrelony szablon w jednostce translacyjnej. W starszym C++ nie jest bowiem moliwe wstrzymanie tworzenia instancji szablonu w takiej sytuacji.C++11 wprowadza ide szablonw zewntrznych w celu zablokowania tworzenia instancji w jednostce translacyjnej. Przykad: extern template class std::vector;W C++11 mona uywa aliasw dla szablonw. Przykad: template using Vec = std::vector;

  • STLSTL (ang. Standard Template Library) to standardowa biblioteka wzorcw w C++.Wszystkie skadniki STL s wzorcami.STL jest rdzeniem biblioteki standardowej C++.Wszystkie identyfikatory w bibliotece standardowej C++ zdefiniowane s w przestrzeni nazw std.Zaleta STL mnstwo gotowych szablonw klas pozwalajcych programowa na wyszym poziomie abstrakcji.Wada STL brak oczywistoci (koniecznie czytaj dokumentacj)

  • STLBiblioteka STL skada si z kilku moduw:strumienie we/wy,acuchy i wyraenia regularne,kontenery i iteratory,algorytmy i obiekty funkcyjne,wielowtkowo i przetwarzanie wspbiene,internacjonalizacja,klasy narzdziowe.

  • Pary Szablon struktury pair (zdefiniowany w ) umoliwia potraktowanie dwch wartoci jako pojedynczego elementu.Para posiada dwa pola: first i second.Para posiada konstruktor dwuargumentowy oraz domylny i kopiujcy.Pary mona porwnywa (operatory == i
  • TupleW C++11 zdefiniowano tuple do przechowywania wielu wartoci a nie tylko dwch (szablon tuple jest analogi do szblony pary pair).Tupla posiada wiele ponumerowanych pl, do ktrych dostp mamy za pomoc metody get.Tupla posiada konstruktor wieloargumentowy oraz domylny i kopiujcy.Tuple mona porwnywa za pomoc operatorw porwna (porwnywanie leksykograficzne).Istnieje szablon funkcji make_tuple() do tworzenia tupli (typy danych s rozpoznawane przez kompilator po typach argumentw).Istnieje szablon funkcji tie() do tworzenia tupli z referencjami (jako argumenty podaje si zmienne).Szablon tuple_size::value suy do podania liczby elementw w tupli. Szablon tuple_element::type suy do podania typu elementu o indeksie idx w tupli.

  • Sprytne wskanikiSprytne wskaniki s zdefiniowane w pliku nagwkowym .Zastpienie szablonu auto_ptr. Szablon klasy shared_pointer wiele takich sprytnych wskanikw moe przechowywa wskanik do tego samego obiektu, tak e obiekt ten oraz zwizane z nim zasoby zostan zwolnione dopiero po likwidacji ostatniego sprytnego wskanika.Szablon klasy unique_pointer tylko jeden sprytny wskanik moe przechowywa wskanik do tego danego obiektu.

  • Ograniczenia liczboweTypy numeryczne posiadaj ograniczenia zalene od platformy i s zdefiniowane w szablonie numeric_limits (zdefiniowany w , stae preprocesora s nadal dostpne w i ).Wybrane skadowe statyczne szablonu numeric_limits: is_signed, is_integer, is_exact, is_bounded, is_modulo, has_infinity, has_quiet_NaN, min(), max()