Deklarieren Sie Variablen am Anfang der Funktion oder in separaten Bereichen?
Ist bevorzugt, Methode 1 oder Methode 2?
Methode 1:
LRESULT CALLBACK wpMainWindow(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
RECT rc;
GetClientRect(hwnd, &rc);
hdc = BeginPaint(hwnd, &ps);
//drawing here
EndPaint(hwnd, &ps);
break;
}
default:
return DefWindowProc(hwnd, msg, wparam, lparam);
}
return 0;
}
Methode 2:
LRESULT CALLBACK wpMainWindow(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rc;
switch (msg)
{
case WM_PAINT:
GetClientRect(hwnd, &rc);
hdc = BeginPaint(hwnd, &ps);
//drawing here
EndPaint(hwnd, &ps);
break;
default:
return DefWindowProc(hwnd, msg, wparam, lparam);
}
return 0;
}
In Methode 1, wenn msg = WM_PAINT, wenn wpMainWindow Funktion aufgerufen wird, braucht es Speicher, die alle Variablen auf dem stack am Anfang? oder nur, wenn es in der WM_PAINT-Bereich?
Würde Methode 1 verwenden Sie nur den Speicher, wenn die Nachricht WM_PAINT, und Methode 2 benutzen Sie die memory-egal, was msg erreicht?
InformationsquelleAutor der Frage Kaije | 2010-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Variablen deklariert werden sollte so lokal wie möglich.
Deklarieren von Variablen "an der Spitze der Funktion" immer eine katastrophal schlechte Praxis. Auch in C89/90 Sprache, wo Variablen können nur erklärt werden, an den Anfang des Blocks, ist es besser zu erklären, so lokal wie möglich, also am Anfang von kleinsten lokalen block umfassen, die die gewünschte Lebensdauer der Variablen. Manchmal ist es vielleicht sogar sinnvoll, für die Einführung eines "redundanten" lokalen block, nur mit dem Zweck der "Lokalisierung" der Deklaration von Variablen.
In C++ und C99, wo es möglich ist, zu erklären, variable irgendwo im code, die Antwort ist ziemlich einfach: immer deklarieren Sie jede variable so lokal wie möglich und so nah wie möglich an dem Punkt, wo Sie es das erste mal. Die primäre Begründung dafür ist, dass in den meisten Fällen wird diese ermöglichen es Ihnen zu liefern, die eine sinnvolle Initialisierung der Variablen an der Stelle der Deklaration (statt Deklaration ohne Initialisierung oder mit einem dummy-Initialisierung).
Als Speicher für die Verwendung, die im Allgemeinen eine typische Implementierung wird sofort (sobald Sie mit der Eingabe der Funktion) Zuordnung der maximal erforderliche Speicherplatz für alle Variablen, die zur gleichen Zeit existieren. Aber Ihre Erklärung Gewohnheiten beeinflussen könnte, die genaue Größe des Raumes. Zum Beispiel in diesem code
alle drei Variablen zur gleichen Zeit existieren und in der Regel den Raum für alle drei allokiert werden. Aber in diesem code
nur zwei Variablen existieren, die in jedem gegebenen moment, was bedeutet, dass Platz für nur zwei Variablen zugewiesen werden, die von einer typischen Implementierung (
b
undc
teilen sich den gleichen Raum). Dies ist ein weiterer Grund, deklarieren Sie Variablen so lokal wie möglich.InformationsquelleAutor der Antwort AnT
Ob etwas auf dem Stapel reserviert im Fall 1 wird durch die Implementierung definiert. Implementierungen sind auch nicht erforderlich auf einen Stapel.
Ist es in der Regel keine langsamer zu tun, da die operation neigt dazu, eine einfache Subtraktion (für eine nach unten wachsende stack) ist ein Wert aus dem stack-pointer für die gesamte lokale Variablen Bereich.
Die Sache, die hier wichtig ist, dass der Umfang sollte so lokal wie möglich. In anderen Worten, erklären Sie Ihre Variablen so spät wie möglich und nur halten Sie so lange wie nötig.
Beachten Sie, dass die Deklaration ist hier auf einer anderen Abstraktionsebene zum zuweisen von Speicherplatz für Sie. Der tatsächliche Speicherplatz zugeteilt werden kann, an den Anfang der Funktion (der Umsetzung), aber Sie können nur diejenigen Variablen, während Sie zugeordnet sind (Stufe C).
Lokalität von Informationen ist wichtig, genau wie seine Cousine, die Kapselung.
InformationsquelleAutor der Antwort paxdiablo
Ich wie Methode 3:
Wenn es verdient einen eigenen Bereich für die Organisation Zwecke, die es verdient seine eigene Funktion. Wenn Sie besorgt über das function-call overhead, stellen Sie es inline.
InformationsquelleAutor der Antwort Ben Voigt
Da es dem compiler die Arbeit zu optimieren, der meinen code, und eine Stunde von compiler-Zeit ist viel billiger, als eine Stunde meiner Zeit, und meine Zeit verschwendet, wenn ich brauche, um einen Bildlauf nach oben und unten den code, um zu sehen, wo eine variable deklariert wurde, ich glaub meine Firma will mich zu halten, alles als lokale wie möglich.
Nicht, auch spreche ich über "das kleinste block', sondern 'wie in der Nähe der Stelle, wo es verwendet wird'!
InformationsquelleAutor der Antwort xtofl
Definieren Sie die Variablen im engsten Bereich, wo Sie relevant sind. Es gibt keinen Grund, verwenden Sie Methode 2, oben, meiner Meinung nach.
Stack-Speicher ist wahrscheinlich nur verwendet werden, wenn die Variablen in scope. @Paxdiablo Punkte, die einheimische wind in Registern statt auf dem stack, wenn der compiler Sie finden den Raum für Sie.
InformationsquelleAutor der Antwort Steve Townsend
Zuweisung von Speicher ist nicht in der Norm festgelegt, um dieses detail, damit für eine wirkliche Antwort wirst du angeben müssen, compiler und Plattform. Es ist nicht die Materie für die Leistung.
Was Sie wollen, ist die Lesbarkeit, und im Allgemeinen, die von der Deklaration von Variablen in die kleinste nutzbare Umfang, und vorzugsweise dann, wenn Sie sofort initialisieren Sie mit vernünftigen Werten. Die kleineren Gültigkeitsbereich eine variable hat, desto weniger kann es möglicherweise die Interaktion mit dem rest des Programms auf unvorhersehbare Weise. Je näher sich die Erklärung auf die Initialisierung, die weniger Gelegenheit für etwas schlimmes passieren.
Was würde wohl besser zu sein, ist so etwas wie
Dies ist für C++. Für C, die Regel ist ähnlich, außer dass es in früheren Versionen von C erforderlich, alle Variablen deklariert werden an der Spitze von einem block.
InformationsquelleAutor der Antwort David Thornley
Können Sie nicht wissen, an welchem Punkt die stack-Reservierung erfolgt ist.
Zur besseren Lesbarkeit würde ich mit C99 (oder C++). Das ermöglicht die Deklaration einer variable wirklich dort, wo Sie zuerst verwenden.
InformationsquelleAutor der Antwort Jens Gustedt
Gibt es keine Notwendigkeit, belasten den stack mit Variablen, die möglicherweise nie verwendet. Reservieren Sie Ihre vars rechts, bevor Sie verwendet werden. Mit Blick auf die
RECT rc
und der nachfolgende AufrufGetClientRect
Ben Voight Methode ist der Weg zu gehen.InformationsquelleAutor der Antwort myeviltacos
Für die Programmiersprache Java, die gängige Praxis ist, um lokale Variablen deklarieren, die nur bei Bedarf in eine Methode.
Für die C++ - Programmiersprache, ich empfehle auch die gleiche Praxis, da das deklarieren von Variablen mit einer nicht-trivialen Konstruktor beinhaltet die Ausführung Kosten. Putting alle diese Erklärungen auf die Methode Anfang verursacht unnötige Kosten, wenn einige dieser Variablen verwendet werden.
C, die Geschichte ist anders. Es hängt von der Architektur und compiler. Für x86-GCC, dass alle Erklärungen auf Funktion Anfang und das deklarieren von Variablen, die nur bei Bedarf die gleiche Leistung. Der Grund ist, dass C-Variablen nicht über einen Konstruktor verfügen. Und der Effekt auf den stack-Speicher-Zuordnung, die durch diese beiden Methoden ist die gleiche. Hier ist ein Beispiel:
Für beide Funktionen, die Assembler-code für stack-manipulation ist:
Dass alle Erklärungen auf Funktion zu Beginn wird Häufig in Linux-kernel-code.
InformationsquelleAutor der Antwort Jingguo Yao