CARL
      VON
OSSIETZKY
            Boost C++ Libraries

            Johannes Diemke

            Department of Computer Science
            Learning and Cognitive Systems
Boost C++ Libraries


Grundlagen
   Freie von Experten begutachtete, portable C++ Bibliothek
   N¨tzlich, unabh¨ngig von speziellen Anwendungsgebieten
    u             a
   Strebt Referenzimplementierung an
   Neuer C++0x Standard wird verschiedene Boost Bibliotheken
   enthalten
   Funktioniert auf fast allen modernen Betriebssystemen
   Bekannte Linux und Unix Distributionen wie Fedora, Debian und
   NetBSD umfassen vor¨bersetzte Boost Packages
                       u




   Johannes Diemke              Boost               12. September 2011   2/18
Boost C++ Libraries


Wieso sollte man Boost nutzen?
   Produktivit¨t
              a
   Beschleunigt anf¨ngliche Entwicklung
                   a
   Weniger Bugs
   Verhindert es das Rad neu zu erfinden“
                 ”
   Langfristige Kosteneinsparungen bei der Wartung




   Johannes Diemke             Boost                 12. September 2011   3/18
Boost C++ Libraries


Die Boost Header Organisation
      Alle Boost Header haben die Endung .hpp
      Sie befinden sich in dem Verzeichnis boost/
      Daher sehen alle Boost #include Direktiven folgendermaßen aus:

                              Listing 1: Boost Header
1   #include <boost/whatever.hpp>
2
3   int main() {
4       // use boost
5       return 0;
6   }




      Johannes Diemke                Boost              12. September 2011   4/18
Boost C++ Libraries


Die Boost Header Organisation (Forts.)
   Organisation ist nicht v¨llig einheitlich:
                           o
          Einige ¨ltere und die meisten sehr kleinen Bibliotheken haben ihre
                 a
          Header direkt in boost/
          Die meisten Header der Bibliotheken sind jedoch in
          Unterverzeichnissen von boost/
               Bsp.: #include <boost/python/def.hpp>
          Einige Blibliotheken haben in boost/ aggregierte Header die alle
          Header einer Bibliothek einbinden
               Bsp.: #include <boost/python.hpp>




    Johannes Diemke                  Boost                  12. September 2011   5/18
Boost C++ Libraries


Header-Only Bibliotheken
   Die meisten Boost Bibliotheken sind Header-Only“
                                      ”
         Bestehen komplett aus Header Dateien
         Enthalten Templates und inline Funktionen
         Es m¨ssen keine seperat kompilierten Bibliotheken gelinkt werden
              u
   Es existieren einige Bibliotheken die seperat ubersetzt und gelinkt
                                                 ¨
   werden m¨ssen
             u
         Sollten diese ben¨tigt werden, so m¨ssen diese in die Makefiles vom
                          o                 u
         TORF Quellcode aufgenommen werden




   Johannes Diemke                  Boost                 12. September 2011   6/18
Boost C++ Libraries


 Ein Minimalbeispiel

                                  Listing 2: main.cpp
 1   #include <iostream>
 2   #include <boost/filesystem.hpp>
 3
 4   int main() {
 5       boost::filesystem::path path("/usr/include");
 6       bool result = boost::filesystem::is_directory(path);
 7
 8        std::cout << "Path is a directory : "
 9                  << std::boolalpha
10                  << result << std::endl;
11
12        return 0;
13   }




         Johannes Diemke                Boost                   12. September 2011   7/18
Boost C++ Libraries


Ein Minimalbeispiel (Forts.)
    Kompilieren und Linken f¨hrt zu unaufgel¨sten Abh¨ngigkeiten
                            u               o        a
       $ g++ main.cpp -o main
    Ben¨tigt die Bibliothek libboost_filesystem.a
       o

Einschub: Bibliotheken (static libraries)
    Sind Sammlungen von vorkompilierten Object-Dateien die in das
    Programm gelinkt werden k¨nnen
                             o
    Werden vom Linker ben¨tigt um Referenzen auf Funktionen
                         o
    aufzul¨sen
          o
    Befinden sich i. d. R. in /usr/lib und /lib



    Johannes Diemke             Boost               12. September 2011   8/18
Boost C++ Libraries


Ein Minimalbeispiel (Forts.)
    Referenzen k¨nnen ohne die externe Bibliothek
                o
    libboost_filesystem.a nicht aufgel¨st werden
                                         o
    Diese muss explizit gelinkt werden
        $ g++ main.cpp -lboost_filesystem -o main
    -lNAME versucht die Bibliothek libNAME.a aus den Standard
    Bibliotheksverzeichnissen zu linken
    die Executable enth¨lt anschließdend auch den Maschinencode f¨r
                       a                                         u
    die im Programm verwendeten Boost-Funktionen




    Johannes Diemke             Boost               12. September 2011   9/18
Boost C++ Libraries




   Johannes Diemke    Boost   12. September 2011   10/18
Boost C++ Libraries


Smart Pointer
   Verhalten sich wie normale Zeiger
   Geben jedoch referenzierte Objekte automatisch frei sobald sie nicht
   mehr ben¨tigt werden
            o
   Erleichtern Operationen mit dynamisch alloziertem Speicher
   Vermeidung von Memoryleaks und Fehlern die durch schlechtes
   Speichermanagement entstehen




   Johannes Diemke               Boost               12. September 2011   11/18
Boost C++ Libraries


Smart Pointer in Boost
   Boost besitzt sechs verschiedene Typen:
          scoped_ptr<T>
          scoped_array<T>
          shared_ptr<T>
          shared_array<T>
          weak_ptr<T>
          intrusive_ptr<T>
   Der Operator delete wird bei ihrer Nutzung nicht ben¨tigt
                                                       o




    Johannes Diemke             Boost              12. September 2011   12/18
Boost C++ Libraries


Ein Minimalbeispiel ohne Smart Pointer


                                 Listing 3: main.cpp
1   #include "CSample.h"
2
3   int main() {
4
5        CSample *pSample = new CSample();
6        pSample->compute();
7
8        delete pSample;
9   }




        Johannes Diemke                Boost           12. September 2011   13/18
Boost C++ Libraries


Der Boost scoped_ptr<T>
        garantiert automatisches L¨schen wenn der Zeiger den
                                    o
        G¨ltigkeitsbereich verl¨sst
         u                     a
        der Operator -> ist uberladen und greift auf das gekapselte Objekt
                            ¨
        zu
                                 Listing 4: main.cpp
1   #include <boost/scoped_ptr.hpp>
2   #include "CSample.h"
3
4   int main() {
5
6        boost::scoped_ptr<CSample> pSample(new CSample);
7        pSample->compute();
8
9   }


        Johannes Diemke                Boost                12. September 2011   14/18
Boost C++ Libraries


Der Boost scoped_ptr<T> (Forts.)
      Eignet sich besonders f¨r die automatische Freigabe von lokalen
                             u
      Objekten
      Performanz wie bei normalen Zeigern

Problem
      Mehrere Zeiger auf das gleiche Objekt sind nicht m¨glich
                                                        o

                        Listing 5: Restriktionen bei scoped_ptr<T>
1   scoped_ptr<CSample> pA(new CSample);
2   scoped_ptr<CSample> pB = pA;   // Compiler-Fehler: nicht erlaubt
3   pA = new CSample;              // Compiler-Fehler: nicht kompatibel




      Johannes Diemke                    Boost                12. September 2011   15/18
Boost C++ Libraries


Der Boost scoped_ptr<T> (Forts.)
      Folgendes ist aber m¨glich:
                          o

                                Listing 6: main.cpp
1   T* scoped_ptr<T>::get()      // gibt den enthaltenen Zeiger zur¨ck
                                                                    u
2      scoped_ptr<T>::reset(T *) // ersetzt den enthaltenen Zeiger mit
3                                // einer neuen Instanz. Die vorige
4                                // Instanz wird dabei freigegeben




      Johannes Diemke                 Boost                 12. September 2011   16/18
Boost C++ Libraries


Der Boost shared_ptr<T>
   Erm¨glicht es mehrere Smart Pointer auf das gleiche Objekt zeigen
       o
   zu lassen
   Ist ein referenzgez¨hlter Zeiger der uberwacht wieviele Zeiger auf ein
                      a                 ¨
   Objekt verweisen

Problem
   Keine zirkul¨ren Referenzen m¨glich
               a                o




   Johannes Diemke               Boost                12. September 2011   17/18
Boost C++ Libraries


 Der Boost shared_ptr<T> (Forts.)
                                  Listing 7: main.cpp
 1   #include <iostream>
 2   #include <boost/shared_ptr.hpp>
 3   #include "CSample.h"
 4
 5   int main() {
 6
 7        boost::shared_ptr<CSample> p1(new CSample());
 8        std::cout << "use count: " << p1.use_count() << std::endl;
 9
10        boost::shared_ptr<CSample> p2 = p1;
11        std::cout << "use count: " << p1.use_count() << std::endl;
12
13        p1.reset();
14        std::cout << "use count: " << p2.use_count() << std::endl;
15   }



         Johannes Diemke                Boost                 12. September 2011   18/18

Boost C++ Libraries

  • 1.
    CARL VON OSSIETZKY Boost C++ Libraries Johannes Diemke Department of Computer Science Learning and Cognitive Systems
  • 2.
    Boost C++ Libraries Grundlagen Freie von Experten begutachtete, portable C++ Bibliothek N¨tzlich, unabh¨ngig von speziellen Anwendungsgebieten u a Strebt Referenzimplementierung an Neuer C++0x Standard wird verschiedene Boost Bibliotheken enthalten Funktioniert auf fast allen modernen Betriebssystemen Bekannte Linux und Unix Distributionen wie Fedora, Debian und NetBSD umfassen vor¨bersetzte Boost Packages u Johannes Diemke Boost 12. September 2011 2/18
  • 3.
    Boost C++ Libraries Wiesosollte man Boost nutzen? Produktivit¨t a Beschleunigt anf¨ngliche Entwicklung a Weniger Bugs Verhindert es das Rad neu zu erfinden“ ” Langfristige Kosteneinsparungen bei der Wartung Johannes Diemke Boost 12. September 2011 3/18
  • 4.
    Boost C++ Libraries DieBoost Header Organisation Alle Boost Header haben die Endung .hpp Sie befinden sich in dem Verzeichnis boost/ Daher sehen alle Boost #include Direktiven folgendermaßen aus: Listing 1: Boost Header 1 #include <boost/whatever.hpp> 2 3 int main() { 4 // use boost 5 return 0; 6 } Johannes Diemke Boost 12. September 2011 4/18
  • 5.
    Boost C++ Libraries DieBoost Header Organisation (Forts.) Organisation ist nicht v¨llig einheitlich: o Einige ¨ltere und die meisten sehr kleinen Bibliotheken haben ihre a Header direkt in boost/ Die meisten Header der Bibliotheken sind jedoch in Unterverzeichnissen von boost/ Bsp.: #include <boost/python/def.hpp> Einige Blibliotheken haben in boost/ aggregierte Header die alle Header einer Bibliothek einbinden Bsp.: #include <boost/python.hpp> Johannes Diemke Boost 12. September 2011 5/18
  • 6.
    Boost C++ Libraries Header-OnlyBibliotheken Die meisten Boost Bibliotheken sind Header-Only“ ” Bestehen komplett aus Header Dateien Enthalten Templates und inline Funktionen Es m¨ssen keine seperat kompilierten Bibliotheken gelinkt werden u Es existieren einige Bibliotheken die seperat ubersetzt und gelinkt ¨ werden m¨ssen u Sollten diese ben¨tigt werden, so m¨ssen diese in die Makefiles vom o u TORF Quellcode aufgenommen werden Johannes Diemke Boost 12. September 2011 6/18
  • 7.
    Boost C++ Libraries Ein Minimalbeispiel Listing 2: main.cpp 1 #include <iostream> 2 #include <boost/filesystem.hpp> 3 4 int main() { 5 boost::filesystem::path path("/usr/include"); 6 bool result = boost::filesystem::is_directory(path); 7 8 std::cout << "Path is a directory : " 9 << std::boolalpha 10 << result << std::endl; 11 12 return 0; 13 } Johannes Diemke Boost 12. September 2011 7/18
  • 8.
    Boost C++ Libraries EinMinimalbeispiel (Forts.) Kompilieren und Linken f¨hrt zu unaufgel¨sten Abh¨ngigkeiten u o a $ g++ main.cpp -o main Ben¨tigt die Bibliothek libboost_filesystem.a o Einschub: Bibliotheken (static libraries) Sind Sammlungen von vorkompilierten Object-Dateien die in das Programm gelinkt werden k¨nnen o Werden vom Linker ben¨tigt um Referenzen auf Funktionen o aufzul¨sen o Befinden sich i. d. R. in /usr/lib und /lib Johannes Diemke Boost 12. September 2011 8/18
  • 9.
    Boost C++ Libraries EinMinimalbeispiel (Forts.) Referenzen k¨nnen ohne die externe Bibliothek o libboost_filesystem.a nicht aufgel¨st werden o Diese muss explizit gelinkt werden $ g++ main.cpp -lboost_filesystem -o main -lNAME versucht die Bibliothek libNAME.a aus den Standard Bibliotheksverzeichnissen zu linken die Executable enth¨lt anschließdend auch den Maschinencode f¨r a u die im Programm verwendeten Boost-Funktionen Johannes Diemke Boost 12. September 2011 9/18
  • 10.
    Boost C++ Libraries Johannes Diemke Boost 12. September 2011 10/18
  • 11.
    Boost C++ Libraries SmartPointer Verhalten sich wie normale Zeiger Geben jedoch referenzierte Objekte automatisch frei sobald sie nicht mehr ben¨tigt werden o Erleichtern Operationen mit dynamisch alloziertem Speicher Vermeidung von Memoryleaks und Fehlern die durch schlechtes Speichermanagement entstehen Johannes Diemke Boost 12. September 2011 11/18
  • 12.
    Boost C++ Libraries SmartPointer in Boost Boost besitzt sechs verschiedene Typen: scoped_ptr<T> scoped_array<T> shared_ptr<T> shared_array<T> weak_ptr<T> intrusive_ptr<T> Der Operator delete wird bei ihrer Nutzung nicht ben¨tigt o Johannes Diemke Boost 12. September 2011 12/18
  • 13.
    Boost C++ Libraries EinMinimalbeispiel ohne Smart Pointer Listing 3: main.cpp 1 #include "CSample.h" 2 3 int main() { 4 5 CSample *pSample = new CSample(); 6 pSample->compute(); 7 8 delete pSample; 9 } Johannes Diemke Boost 12. September 2011 13/18
  • 14.
    Boost C++ Libraries DerBoost scoped_ptr<T> garantiert automatisches L¨schen wenn der Zeiger den o G¨ltigkeitsbereich verl¨sst u a der Operator -> ist uberladen und greift auf das gekapselte Objekt ¨ zu Listing 4: main.cpp 1 #include <boost/scoped_ptr.hpp> 2 #include "CSample.h" 3 4 int main() { 5 6 boost::scoped_ptr<CSample> pSample(new CSample); 7 pSample->compute(); 8 9 } Johannes Diemke Boost 12. September 2011 14/18
  • 15.
    Boost C++ Libraries DerBoost scoped_ptr<T> (Forts.) Eignet sich besonders f¨r die automatische Freigabe von lokalen u Objekten Performanz wie bei normalen Zeigern Problem Mehrere Zeiger auf das gleiche Objekt sind nicht m¨glich o Listing 5: Restriktionen bei scoped_ptr<T> 1 scoped_ptr<CSample> pA(new CSample); 2 scoped_ptr<CSample> pB = pA; // Compiler-Fehler: nicht erlaubt 3 pA = new CSample; // Compiler-Fehler: nicht kompatibel Johannes Diemke Boost 12. September 2011 15/18
  • 16.
    Boost C++ Libraries DerBoost scoped_ptr<T> (Forts.) Folgendes ist aber m¨glich: o Listing 6: main.cpp 1 T* scoped_ptr<T>::get() // gibt den enthaltenen Zeiger zur¨ck u 2 scoped_ptr<T>::reset(T *) // ersetzt den enthaltenen Zeiger mit 3 // einer neuen Instanz. Die vorige 4 // Instanz wird dabei freigegeben Johannes Diemke Boost 12. September 2011 16/18
  • 17.
    Boost C++ Libraries DerBoost shared_ptr<T> Erm¨glicht es mehrere Smart Pointer auf das gleiche Objekt zeigen o zu lassen Ist ein referenzgez¨hlter Zeiger der uberwacht wieviele Zeiger auf ein a ¨ Objekt verweisen Problem Keine zirkul¨ren Referenzen m¨glich a o Johannes Diemke Boost 12. September 2011 17/18
  • 18.
    Boost C++ Libraries Der Boost shared_ptr<T> (Forts.) Listing 7: main.cpp 1 #include <iostream> 2 #include <boost/shared_ptr.hpp> 3 #include "CSample.h" 4 5 int main() { 6 7 boost::shared_ptr<CSample> p1(new CSample()); 8 std::cout << "use count: " << p1.use_count() << std::endl; 9 10 boost::shared_ptr<CSample> p2 = p1; 11 std::cout << "use count: " << p1.use_count() << std::endl; 12 13 p1.reset(); 14 std::cout << "use count: " << p2.use_count() << std::endl; 15 } Johannes Diemke Boost 12. September 2011 18/18