3 Stimmen

C++: Ist Windows.h generell eine effiziente Code-Bibliothek?

Ich habe gehört, wie sich einige Leute beschwert haben über einschließlich die Windows-Header-Datei in einer C++-Anwendung und mit es. Sie sagten, es sei ineffizient. Ist das nur eine urbane Legende oder stecken wirklich harte Fakten dahinter? Mit anderen Worten: Wenn Sie glauben, dass es effizient oder ineffizient ist, erklären Sie bitte anhand von Fakten, wie das sein kann.

Ich bin kein C++-Windows-Programmierguru. Ausführliche Erklärungen wären mir sehr willkommen.


*Edit: Ich möchte es zur Kompilierzeit und bei der Ausführung wissen. Tut mir leid, dass ich das nicht erwähnt habe.

2 Stimmen

Sie meinen, effizient zur Kompilierzeit, richtig? Wenn ja, ist es normalerweise vorkompiliert, aber Sie müssen es einbinden, wenn Sie es brauchen...

1 Stimmen

Ich denke, es ist in der Regel ineffizient in Bezug auf die Kompilierung; der Header ist RIESIG und enthält noch mehr riesige Header. Es führt eine riesige Menge an Symbolen in den globalen Namespace ein und bringt C++-Anwender zum Weinen.

0 Stimmen

Was meinen Sie mit ineffizient? Sie ist zwar groß, aber es handelt sich nur um eine Header-Datei. Sie können sie verschlanken, indem Sie ihr einige #define-Anweisungen voranstellen. Siehe hier de.wikipedia.org/wiki/Windows.h

4voto

Pavel Minaev Punkte 97251

windows.h ist keine "Code-Bibliothek". Es handelt sich um eine Header-Datei, die keinen ausführbaren Code enthält (mit Ausnahme von Makro-Definitionen, die jedoch nicht kompiliert werden - ihre Erweiterungen werden kompiliert, falls und wenn Sie sie verwenden).

Aus reiner Leistungsperspektive betrachtet, wirkt sich die Einbindung lediglich auf die Kompilierungszeit aus. Das ist ziemlich wichtig, obwohl - zum Beispiel, wenn mit Platform SDK Header, die mit VS2010 kommen, #include <windows.h> auf ~2,4 MB Code erweitert - und all dieser Code muss vom Compiler geparst und verarbeitet werden.

Andererseits, wenn Sie vorkompilierte Header verwenden (und das sollten Sie wahrscheinlich in diesem Szenario), würde es Sie nicht beeinträchtigen.

3voto

Dean Harding Punkte 69243

Wenn Sie es vorkompilieren, ist der Unterschied in der Kompiliergeschwindigkeit kaum spürbar. Der Nachteil der Vorkompilierung ist, dass man nur einen vorkompilierten Header pro Projekt haben kann, so dass die Leute dazu neigen, eine einzige "precompiled.h" (oder "stdafx.h") zu erstellen und Windows.h, boost, stl und alles andere, was sie brauchen, darin einzuschließen. Das bedeutet natürlich, dass man Windows.h-Zeug auch in cada .cpp-Datei, nicht nur die, die sie benötigen. Das kann ein Problem in plattformübergreifenden Anwendungen sein, aber Sie können das umgehen, indem Sie alle Win32-spezifischen Dinge in einer statischen Bibliothek (die Windows.h vorkompiliert hat) tun und mit dieser in Ihrer Hauptdatei verknüpfen.

Zur Laufzeit ist das Zeug in Windows.h so gut, wie man es in Windows nur bekommen kann. Es gibt also wirklich keine "Ineffizienzen" in dieser Hinsicht.

Ich würde sagen, dass die meisten Leute, die ernsthafte Windows-GUI-Sachen tun, eine 3rd-Party-Bibliothek (Qt, wxWidgets, MFC, etc.) verwenden würden, die typischerweise geschichtet ist auf der Spitze von das Win32-Zeug, das in Windows.h definiert ist (zum größten Teil), so dass, wie ich sagte, unter Windows das Zeug in Windows.h im Grunde das nackte Metall ist.

2voto

John Dibling Punkte 96619

Es gibt mehrere Stellen, an denen Effizienz ins Spiel kommt.

Einschließlich <windows.h> wird die Kompilierzeit erheblich verlängern und viele Symbole und Makros einbringen. Einige dieser Symbole oder Makros können mit Ihrem Code in Konflikt geraten. Wenn Sie also aus dieser Sicht keine <windows.h> wäre es zur Kompilierzeit ineffizient, sie einzubringen.

Die erhöhte Kompilierzeit kann durch die Verwendung von vorkompilierten Headern etwas gemildert werden, aber das bringt auch ein wenig mehr Komplexität in der Codebasis mit sich (man braucht mindestens 2 weitere Dateien für die PCH), und einige Kopfschmerzen, die nur bei PCHs auftreten. Nichtsdestotrotz verwende ich für große Windows-Projekte normalerweise einen PCH. Für Spielzeug- oder Utility-Projekte verwende ich ihn normalerweise nicht, weil er mehr Ärger macht als er wert ist.

Auch zur Laufzeit kommt die Effizienz ins Spiel. Soweit ich weiß, kann man, wenn man #include <windows.h> aber keine dieser Möglichkeiten verwenden, wird dies keine Auswirkungen auf das Laufzeitverhalten Ihres Programms haben, zumindest was den Aufruf von zusätzlichem Code und dergleichen betrifft. Es kann jedoch andere Auswirkungen auf die Laufzeit geben, die mir nicht bekannt sind.

Was die große Frage des weißen Elefanten angeht: "Ist Windows effizient?" Ich werde hier nicht näher darauf eingehen, sondern nur Folgendes sagen: Die Verwendung von Windows ist wie alles andere auch: Wie effizient oder ineffizient es ist, hängt hauptsächlich von Ihnen ab und davon, wie gut Sie wissen, wie man es verwendet. Sie werden so viele verschiedene Meinungen dazu erhalten, wie Sie Leute fragen, die von "Winblowz ist scheiße" bis "Ich liebe Windows, es ist großartig" reichen. Ignorieren Sie sie alle. Lernen Sie, in Windows zu programmieren, wenn Sie es brauchen und wollen, und bilden Sie sich dann Ihre eigene Meinung.

2voto

Erik Hermansen Punkte 1918

Wie bereits festgestellt wurde, verlangsamt das Einbinden von Windows.h die Kompilierzeit. Sie können vorkompilierte Header verwenden oder die Windows-Aufrufe auf die Module beschränken, die sie benötigen, um die Kompilierung zu erleichtern.

Außerdem können Sie diese preproc-Definitionen vor dem Windows.h-Include wie folgt hinzufügen:

#define WIN32_LEAN_AND_MEAN
#define VC_EXTRALEAN
#include <windows.h>

Dadurch wird die Anzahl der Definitionen in Windows.h und in den subincludierten Header-Dateien reduziert. Möglicherweise stellen Sie später fest, dass Sie das Lean-and-Mean entfernen müssen, aber versuchen Sie es zuerst und warten Sie, bis der Compiler sich über eine fehlende Definition beschwert.

Die Namespace-Konflikte sind ein legitimes Ärgernis, haben aber technisch gesehen nichts mit Effizienz zu tun, es sei denn, Sie zählen die Effizienz Ihres persönlichen Zeitaufwands. Wenn man bedenkt, wie viele Tausende von Definitionen in Ihren Namespace geworfen werden, sind Konflikte irgendwann vorprogrammiert, und das kann sehr ärgerlich sein. Verwenden Sie einfach die Praxis, Ihre Windows-Aufrufe in Modulen zu isolieren, und es wird Ihnen nichts passieren. Dazu setzen Sie #include Windows.h in die .cpp-Datei und nicht in die .h-Datei.

Ich sehe keinen Grund zu der Annahme, dass die Laufzeitleistung der ausführbaren Datei durch die Einbindung von Windows.h beeinträchtigt wird. Sie fügen dem vom Compiler verwendeten Kontext lediglich eine große Anzahl von Definitionen hinzu. Sie fügen nicht einmal alle Definitionen in Ihren kompilierten Code ein - nur Zuweisungen, Funktionsaufrufe und Verweise, die auf den in Ihrem Quellcode (.cpp) verwendeten Definitionen basieren.

Ein weiteres Argument könnte sein, dass die Windows-API-Typen und -Funktionen von Natur aus ressourcenverschwendend sind oder ineffizient arbeiten. Wenn Sie z. B. eine Datei erstellen wollen, müssen Sie der Windows-API eine monströse Struktur übergeben. Dennoch denke ich, dass das meiste davon ein Pfennigfuchser-Denken ist. Bewerten Sie die Leistungsprobleme der Windows-API von Fall zu Fall und ersetzen Sie ineffizienten Code, wo dies möglich und sinnvoll ist.

1voto

Diego Sevilla Punkte 27639

Im Allgemeinen ist das Einbinden von Windows.h eine Notwendigkeit: Wenn Sie Windows-Funktionen benötigen, müssen Sie es einbinden. Ich denke, was Sie meinen, ist (unter anderem) die verschachtelte Einbindung von Windows.h. Das heißt, Sie binden eine .h ein, die wiederum Windows.h einbindet, und Sie auch schließen Sie Windows.h in Ihre .cpp-Datei ein. Dies führt natürlich zu Ineffizienzen, so dass Sie in Ihrem Code sehr gut studieren müssen, welche .h-Dateien in jeder .h-Datei enthalten sind, und vermeiden, dass z. B. Windows.h n-mal enthalten ist indirekt .

1 Stimmen

Lesen Sie den Anfang von Windows.h. Es werden keine Definitionen für verschachtelte Einschlüsse hinzugefügt. Es gibt Code wie #ifndef WINDOWS_H (alle Definitionen) #endif

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X