Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

05.01.2013, 23:45

Höchstens so langsam wie ein einfacher Virtual Function Call... ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

12

06.01.2013, 01:25

Eine Vektor-Addition für einzelne Vektoren würde man daher lieber nicht in eine DLL packen.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

13

06.01.2013, 11:40

Ich hab mich bei dem Thema ja schon oft aus dem Fenster gehängt, aber ich tu's gern nochmal :-)

Vorteile:
- Code unabhängig austauschbar, sofern jedes Detail der Schnittstelle exakt gleich bleibt
- coole Möglichkeiten für Plugins und dynamische Code-Einbettung

Nachteile:
- getrennter Heap und viele potentielle Konflikte mit der CRT, Klassen usw.
- jeder Aufruf kostet mehr Zeit als eine normale Funktion
- kein Inlining und keine globale Optimierung möglich
- DLL enthält immer alle Funktionalität, egal was der DLL-Nutzer eigentlich braucht

Meiner Meinung nach sind DLLs wirklich nur für die seltenen Fälle gut, bei denen man Code dynamisch laden will, den Code also zur Laufzeit noch nicht kennt. Und natürlich bei den Fällen, bei denen man schlicht keine Wahl hat. Für alles andere würde ich statisches Linken empfehlen. Schneller, kleiner, weniger Gerümpel.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

06.01.2013, 11:55

Ich stimmt dir bei allem was du gesagt hast zu, einen ganz wesentlichen Punkt hast du aber vergessen: Verschiedenste Anwendungen können den Code sharen. Wenn jede .exe Dinge wie z.B. die WinAPI statisch linken würde, dann gute Nacht... ;)

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

15

06.01.2013, 16:35

Ist halt die Frage, welche Art von Code man wie auslagern will. Wie David schrieb ist es Quatsch, eine simple Vector3D-Klasse oder sowas in eine DLL zu packen. Das wird nur langsam. Seltenere Funktionsaufrufe, und da zähle ich mal das WinAPI dazu, oder riesige/zeitintensive Funktionen wie das Packen eines Ordners mit 7Zip, können getrost in DLLs geballert werden. Wenn's schnell gehen muss: Statisch linken. Wenn's noch schneller/einfacher gehen muss: Header-Only-Bibliothek. Im lustigsten Fall hat man am Ende eine fat binary im uneigentlichen Sinne.

Zitat

Höchstens so langsam wie ein einfacher Virtual Function Call... ;)
Das hängt vom Prozessor und Betriebssystem ab, da unterschiedliche Ladezeiten entstehen können. Prozesse haben für Gewöhnlich ihren eigenen, virtuellen Adressraum, in dem sich allerdings nicht die DLL befindet. Ein paar Extra-Takte dürften also für Adress-Umrechnung anfallen. Aber was sind schon ein paar Takte.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

06.01.2013, 16:44

Ist halt die Frage, welche Art von Code man wie auslagern will. Wie David schrieb ist es Quatsch, eine simple Vector3D-Klasse oder sowas in eine DLL zu packen. Das wird nur langsam. Seltenere Funktionsaufrufe, und da zähle ich mal das WinAPI dazu, oder riesige/zeitintensive Funktionen wie das Packen eines Ordners mit 7Zip, können getrost in DLLs geballert werden. Wenn's schnell gehen muss: Statisch linken. Wenn's noch schneller/einfacher gehen muss: Header-Only-Bibliothek.

richtig

Zitat

Höchstens so langsam wie ein einfacher Virtual Function Call... ;)
Das hängt vom Prozessor und Betriebssystem ab, da unterschiedliche Ladezeiten entstehen können. Prozesse haben für Gewöhnlich ihren eigenen, virtuellen Adressraum, in dem sich allerdings nicht die DLL befindet. Ein paar Extra-Takte dürften also für Adress-Umrechnung anfallen. Aber was sind schon ein paar Takte.

Natürlich hängt das vom Prozessor und Betriebssystem ab, aber wenn wir berücksichtigen, dass wir das Jahr 2012 schreiben und Dinge wie z.B. Waschmaschinen ausschließen, dann implementiert das Betriebssystem Virtual Memory auf Basis von Paging und die Addressumrechnung ist ein Overhead der da ist, wann immer irgendwo auf Speicher zugegriffen wird und wird z.B. von der MMU des Prozessors völlig transparent in Hardware erledigt. In jedem Fall wird eine dll in den Addressraum des jeweiligen Prozesses gemapped, anders würde das alles gar nicht funktionieren... ;)

Zusätzlicher Overhead gegenüber einem direkten, normalen Function Call entsteht lediglich aus der Tatsache, dass die Funktion dynamisch gebunden wird und daher über einen Zeiger aufgerufen werden muss. Unter Windows funktioniert das so, dass deine Binary eine sog. Import Address Table hat, die Zeiger auf Funktionen und Variablen, die aus einer dll importiert werden sollen enthält. Die Binary realisiert alle Aufrufe bzw. Zugriff dann über diese Zeiger und das Betriebbssystem mapped beim Laden alle benötigten dlls in den Addressraum des neuen Prozesses und füllt die Tabelle aus.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (06.01.2013, 17:00)


17

06.01.2013, 16:57

Würdet ihr z.B. GUI-Elemente in eine DLL machen? Außerdem wurde hier auch schon der Konflikt mit Klassen genannt. Da wäre auch meine Frage, ob es möglich ist eine Klasse einfach zu Exportieren, oder ob das komplizierter ist, als mit Funktionen.
Hi

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

06.01.2013, 17:07

Würdet ihr z.B. GUI-Elemente in eine DLL machen?

Auch welchen Gründen genau möchtest du das in eine dll packen?

Außerdem wurde hier auch schon der Konflikt mit Klassen genannt. Da wäre auch meine Frage, ob es möglich ist eine Klasse einfach zu Exportieren, oder ob das komplizierter ist, als mit Funktionen.

Rein prinzipiell kann eine dll nur Funktionen und Variablen exportieren. Alles weitere geht lediglich über compilerspezifische Spracherweiterungen wie z.B. dllexport von MSVC und ist nicht unproblematisch. Rein prinzipiell funktioniert es damit zwar relativ einfach, aber man muss eben aufpassen was man tut. Ein beliebter Fallstrick ist z.B., dass Leute gleich mal Dinge wie z.B. einen std::string an eine Funktion in einer dll übergeben, was nur unter ganz bestimmten Voraussetzungen nicht dazu führt, dass gleich alles in die Luft fliegt. Abgesehen davon bin ich persönlich der Meinung, dass dllexport für Klassen rein prinzipiell den Sinn von dlls untergräbt.

LInsoDeTeh

Treue Seele

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

19

07.01.2013, 09:58

Aus aktuellem Kontext:

Ich verwende für mein Spiel zB DLLs, damit Spieler eigene Sektortypen importieren können. Ich kann ja nicht für jeden Sektor, den jemand aus der Community entwickelt, eine neue Build des Spiels erzeugen und rausbringen. Also kann ein Spieler eine DLL erzeugen, die den Code zur Erzeugung des Sektors enthält. Die implementiert dann eine mit dem Spiel gemeinsame Schnittstelle, die ebenfalls wieder in einer DLL vorliegt. Diese DLL enthält dann auch noch ein paar userdefinierte Objekte, die in der Schnittstelle verwendet werden.
Auf diese Weise kann ein Spieler einfach eine DLL erzeugen, in den Ordner des Spiels stecken und schon kann das Spiel auf den darin definierten Sektor zugreifen, ohne, dass ich am Spiel selbst irgendetwas verändern muss. Der Vorteil dürfte relativ klar sein :)

Ein weiteres Beispiel aus meinem aktuellen beruflichen Projekt:
Der Kunde wünscht eine rein plugin-basierte Software, sprich eine .exe, die immer gleich ist (und nur das Basisfenster mit Statusleiste, TreeView, und Menü enthält) und dann werden nur noch zusätzliche DLLs ausgerollt, um neue Plugins automatisch in die Software zu integrieren, ohne die .exe anfassen zu müssen. Dieses DLLs enthalten dann sowohl Benutzeroberflächen (User Controls) als auch den entsprechenden Code.

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

20

07.01.2013, 14:34

Ich verwende beides. Aber ich verweise noch auf einen Punkt, der bisher nicht genannt wurde, nämlich den Begriff "DLL-Hell". Und den gibts nicht umsonst. Wenn man mal ein Rudel an DLLs zusammen hat, dann kann das ganz schön nervig werden, vorallem wenn versch. Anwendungen gleiche Abhängigkeiten mit unterschiedlichen Versionen haben. Beispiel hierzu Qt: Ich habe hier ständig Konflikte weil Tools wie Tortoise<SCM-hier> ihre Qt-DLLs über die Pfad-Umgebungsvariable im ganzen System bekannt machen. Das kollidiert dann mit Release-Builds der eigenen Projekte, weil die je nachdem die Qt-DLL von Tortoise zuerst finden. Ganz schlimm wird das bei DLLs wenn man mal mit .NET, Managed C++ Wrapper und Native C++ DLLs gearbeitet hat.
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

Werbeanzeige