Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++

#pragma

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Sie sehen die Auswirkungen der #pragma-Anweisung und erhalten vom Trainer Tipps und Tricks, wie Sie diese in Ihrem Programm einsetzen.

Transkript

Ich möchte Ihnen jetzt mal die sogenannten "Pragmas" zeigen. "Pragmas" fangen auch mit einem "Sharp"-Zeichen an, sind aber eigentlich Steuerzeichen für den Compiler. Der Compiler hat verschiedene Optionen. Das hängt jetzt immer sehr vom Betriebssystem und vom Compiler ab, was man da überhaupt Sinnvolles angeben kann. Es gibt aber ein "Pragma", was recht interessant ist: Das "Pack-Pragma". Und ich zeige Ihnen mal kurz, was es damit auf sich hat. Wir müssen dazu natürlich ein bisschen vorgreifen, sonst kann ich Ihnen den Effekt nicht zeigen. Ich habe hier eine sogenannte Datenstruktur mit "struct" definiert, die fasst einfach mehrere Variablen zusammen in einen Datenblock. Den kann später dann zum Beispiel mal als Feld verwenden. Hier ein "character" mit "ch", ein "integer" als "i", "short j" und "double k". Das Gleiche habe ich hier unten nochmal definiert. Da nenne ich die Struktur "T" und hier nenne ich die Strukur "S". Aber der Unterschied: Ich stelle jetzt hier dieses "Pragma Pack" davor. Und dann, um zu zeigen, was das überhaupt tut, "pack" heißt "packen", muss ich berechnen, wo diese Variablen im Hauptspeicher stehen und dazu gibt es ein Makro, das heißt "offsetof" und das ist hier im Standard-Def-Header deklariert, den muss man dazu nämlich reinladen, damit das überhaupt funktioniert. Und ich starte mal das Programm und dann kann ich Ihnen auch erklären, was da im Prinzip abläuft. Hier habe ich jetzt die Werte null, vier, acht, sechzehn, beim Ersten und beim Zweiten: null, zwei, sechs, acht. Das merken wir jetzt mal. Null, ich schreibe das hier als Kommentar hin, habe ich hier bekommen. Hier habe ich den Wert zwei, hier den Wert sechzehn und hier den Wert acht bekommen. Und hier oben ist es einfach in Viererschritten gelaufen, nämlich hier hatte ich den Offset null, vier, acht und den entsprechenden Wert könnte ich Ihnen nochmal zeigen. Da springt er mir natürlich dann auf die nächsten sechzehn, also hier sind acht Unterschied, das sind vier Unterschied. Das liegt daran, dass der Standard allein, wie er in diesem Hauptspeicher angelegt wird, vier Bytes beträgt. Das "character" belegt also vier Bytes und danach kommt mit einem "offset" vier der "integer", der auch vier Bytes belegt. Das ist bei "integern" ja auf jeden Fall so. Der "short" belegt eigentlich nur zwei Bytes, aber es werden trotzdem vier Bytes belegt und der "double" belegt acht Bytes, deshalb komme ich dann auf ein "offset" hier von entsprechend sechzehn. So. Jetzt kommt der interessante Unterschied. Jetzt starten wir es nochmal, hier hab ich mich, glaub ich, nochmal vertippt, das kann nicht sein, dass das da sechzehn ist. Null, zwei, sechs, acht. So stimmt das schon besser. Da habe ich den "offset" null. Es fängt bei null an, dann addiere ich jetzt zwei Bytes drauf, weil hier oben "pack 2" steht, macht der das mit zwei Bytes. Dann brauche ich vier Bytes als Platzreservierung und dann addiere ich wieder zwei Bytes und komme hier auf die Position acht. Der "double" selber würde ja jetzt nochmal acht belegen, aber de nächsten "offset" sehe ich natürlich hier an der Stelle noch nicht. Hier gebe ich mir einfach die "offsets", hier unten im Klartext, mit "printf" mal zur Abwechslung statt "cout" aus. Ja, jetzt kann ich das hier mal abändern. Wir nehmen hier mal "pack 1". Das ist die dichteste, kompakte Art. Wir starten das mal. Dann habe ich null, eins fünf, sieben. Schreiben wir das mal hierhin. Das muss natürlich gleich sein, weil das der erste "offset" ist. Eins, dann habe ich hier fünf und hier habe ich sieben. Nun, was passiert hier? Das belegt genau ein Byte, also komme ich hier auf den "offset" eins, dann werden vier Bytes belegt, ich komme nach fünf, es werden zwei Bytes belegt, hier bin ich bei sieben. Warum braucht man das? Manchmal muss man auf Peripheriedaten oder Dateidaten direkt zugreifen und die sind vielleicht fest aufgebaut, da weiß ich das "character" hat ein Byte und das hat zwei und vier und so weiter und so fort. Und dann kann ich genau auf diese Datenstrukturen zurückgreifen. Im Hauptspeicher dagegen, wenn ich nur im Haupspeicher arbeite, wäre das ziemlich doof, weil die Art und Weise, wie der Compiler, bzw. der Prozessor darauf zugreift, ist nämlich unterschiedlich. Das dauert länger, weil das so verschoben im Speicher steht. Viel schneller sind die Zugriffe hier zum Beispiel in Vierergrenzen oder sogar auf Achtergrenzen, je nachdem, ob man einen 32-Bit- oder einen 64-Bit-Rechner hat, das ist nämlich unterschiedlich. Da kann er besonders schnell in den Speicher zugreifen, wenn das auf dem "alignment" hier liegt, auf dem "default alignment". Während mit dem "pack alignment", muss er unter Umständen intern hin- und herschieben, um an die einzelnen Bytes heranzukommen oder sogar Bits. Und deshalb ist das natürlich ungünstiger, was die Zugriffszeiten angeht, aber wie gesagt, das "pack" braucht man manchmal, um eben an die Peripherie zuzugreifen, oder auch natürlich, um auf Dateien zuzugreifen, wenn Sie irgend welche vorgefertigten Dateien haben, da ist es so, dass man da sehr häufig diese "Pack"-Anweisung benötigt. Also, Sie haben gelernt, es gibt "Pack"-Anweisungen, die man vielleicht mal braucht, wenn man später mal mit Dateisysemen arbeitet. Es gibt dieses "Pragma" aber auch für andere Dinge. Auf Macintosh gibt es zum Beispiel ein schönes "Pragma". Da kann ich mir hier diese Zeile markieren und finde die dann hier oben einfach als Pulldown-Menü, um da schnell hinzuspringen. Also es ist sehr unterschiedlich bei den einzelnen Compilern. Der Trick ist aber, dass die "Pragmas" ignoriert werden, wenn der Compiler sie nicht versteht oder bestenfalls halt eine entsprechende Warnung ausgeben.

C++

Machen Sie sich mit den einfachen Grundlagen zu C++ vertraut und lernen Sie anhand zahlreicher Übungs- und Codebeispiele die Klassenkonzepte, Prozeduren und Funktionen kennen.

9 Std. 3 min (143 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Video-Training auf DVD mit Bonusmagazin

+ Tutorial to go: Mit Videos für iPod, iPhone & Co.

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!