2017-04-21 1 views
2

Das ist wahrscheinlich eine dumme Frage, aber ich habe es schwer, etwas online zu finden.kann lokale Variablenzuweisung werfen?

Ich weiß, operator new kann eine bad_alloc exception werfen, wenn es nicht Speicher zuordnen, aber was passiert mit der lokalen Variablenzuordnung?

stelle ich mir ein System, wo es keine mehr Speicher zur Verfügung und das Programm ausführt, so etwas wie:

void do_something(){ 
int a = 0; 
} 

Was wird passieren? Wie ist der Platzbedarf für "a" vergeben? Kann es werfen?

bekam ich die Frage von Code ähnlich wie diese irgendwo zu sehen:

void do_something() noexcept { 
    // some local variables being allocated 
} 

Es hat mich die Beziehung zwischen keine Ausnahme und lokalen Speicherzuweisung fragen. Um die Dinge etwas verwirrender zu machen, sah ich this, was mich wundert, wenn die Speicherzuweisung tatsächlich passiert ...

+1

Ich würde denken, das würde einen StackOverflow verursachen?Obwohl mir das nie passiert ist. – Carcigenicate

+0

Ich gehe davon aus, dass das Programm nur abstürzen würde, weil es Speicher nicht hinzufügen kann, so würde es nur einen Fehler werfen? –

+1

Mit modernen Betriebssystemen kann dies wegen virtuellem Speicher nicht passieren. @CJHutchison – Sridharan

Antwort

2

Ich glaube nicht, dass do_something(){ int a = 0; } werfen kann. Es gibt nicht so etwas wie Lagerung für ‚a‘ zugeordnet, in den meisten Fällen wird dies in Prozessorregister sein und Sie nicht wissen, ob es auch im internen Speicher oder nicht gespeichert werden ..

In Bezug auf

void do_something() noexcept { 

Das teilt dem Compiler einfach mit, dass Ihre Funktion do_something keine C++ - Exceptions ausgeben kann. Daher kann der Compiler einige Annahmen treffen und möglicherweise einige zusätzliche Optimierungen vornehmen.

+0

In Ihrem ersten Fall würde das nur optimiert werden, da es keine Nebenwirkungen gibt und es nie verwendet wird. Wenn es verwendet wird, können Sie nicht davon ausgehen, dass es in ein Register gehen wird. – Donnie

+0

Es gibt Speicher für jede Variable, die nicht optimiert ist, was einfach zu verhindern ist. Ich glaube, dass lokale Variablen in die Block-Scope-Kategorie fallen und somit über * automatischen Speicher * verfügen. Die eigentliche Frage ist, ob die automatische Speicherzuweisung ausgelöst oder fehlschlagen kann. – luk32

+0

'void do_something() {std :: Vektor foo (1000000000000000LL); } 'kann werfen und' foo' ist ein automatisches Objekt. – NathanOliver

0

Nr

Automatische Variablen wird auf dem Stack gespeichert (muß nicht sein, aber ich habe noch nie über einen Compiler gehört, dass AFAIK, dass andere Art und Weise implementiert). Da Stack zur Laufzeit zugewiesen wird, gibt es keine Möglichkeit, dass ein Programm einen Allok-Fehler auslöst (weil es bereits zugewiesen ist, oder?).

Natürlich kann Fehler während der Verwendung dieser lokalen Variable, i. e. Es kann ein Speicherproblem auf der physischen/os-Ebene geben. In diesem Fall wird jedoch ein entsprechendes Signal ausgelöst, keine Ausnahme.

+1

Sie können eine Instanz von 'std :: vector' haben, die ein automatisches Objekt ist, aber das Konstrukt kann werfen. Viele automatische Objekte können auf den Bau werfen. Wenn wir jetzt nur über POD-Objekte reden, ist das eine andere Geschichte. – NathanOliver

0

Um zu verfolgen, was Sie gesagt haben, kann mit Operator neu passieren, bad_alloc kann mit jedem dynamisch zugewiesenen Speicher passieren. Also irgendwelche Zeiger, Smart Pointer, viele Container usw. Diese Zuordnung findet auf Heap statt.

Dann gibt es einen Stapelspeicher, wo nicht dynamisch zugewiesene Variablen wie lokale wie die in Ihrem Beispiel oder irgendwelche globalen oder statischen Variablen und viele andere Dinge sind.

Um Ihre Frage zu beantworten, wenn die lokale Variable nicht zuweisen würde, würde das wahrscheinlich bedeuten, dass Ihnen der Stapelspeicher ausgeht, was als Stapelüberlauf bezeichnet wird. Wenn dies der Fall ist, ist das Auslösen einer Ausnahme keine Option. Wenn Sie die Exception werfen, wird der Speicher für das geworfene Objekt im Stack zugewiesen, und in diesem Fall würde es auch werfen. In diesem Fall ist es wahrscheinlicher, dass Ihr Programm gerade beendet wird.

Und um Punkte in Kommentaren zu erwähnen, ja, in der Regel werden Initialisierungen wie die in Ihrem Code vom Compiler optimiert.