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

1

23.04.2011, 11:15

Wird für die Variable immer neuer Speicher angelegt?

Hallo,

wird für eine Variable die in einer Schleife bei jedem durchlauf neu deklariert wird, immer wieder
neuer Speicher angelegt?

Also z.B

C-/C++-Quelltext

1
2
3
4
while(GameLoop)
{
int Integer;
}


Wo liegt der Unterschied, außer das die Variable "Integer" immer wieder einen
undefenierten Wert zugewiesen bekommt, zu dem hier:

C-/C++-Quelltext

1
2
3
4
5
int Integer;
while(GameLoop)
{
//...
}


Das würde mich mal interessieren...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

23.04.2011, 11:20

wird für eine Variable die in einer Schleife bei jedem durchlauf neu deklariert wird, immer wieder
neuer Speicher angelegt?

Prinzipiell Ja, allerdings kostet das praktisch nichts sofern es sich dabei nur um einen int handelt. Wenn es ein komplexeres Objekt ist kann das teuer werden, wobei nicht das Reservieren des Speichers sondern der Konstruktoraufruf der wesentliche Faktor dabei ist.

Also z.B

C-/C++-Quelltext

1
2
3
4
while(GameLoop)
{
int Integer;
}


Wo liegt der Unterschied, außer das die Variable "Integer" immer wieder einen
undefenierten Wert zugewiesen bekommt, zu dem hier:

C-/C++-Quelltext

1
2
3
4
5
int Integer;
while(GameLoop)
{
//...
}

Integer hat in beiden Fällen undefinierten Wert. Der Unterschied liegt im Scope.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

3

23.04.2011, 11:22

Im ersten Fall erstellst du n Mal einen Integer, machst n Mal irgendwas damit und zerstörst ihn n mal wieder.
Im zweiten Fall erstellst du einmal einen Integer, machst n Mal was damit und zerstörst ihn einmal wieder.

Bei einem Integer ist es jetzt nicht so schlimm, aber generell sollte man - wenn man die Möglichkeit hat - eine Variable vor einer Schleife erstellen und nicht innerhalb der Schleife immer wieder neu.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

4

23.04.2011, 11:27

Nein, der Speicher wird nicht immer neu angelegt. Die Variable liegt auf dem Stack und dieser wird einmalig zu Beginn des Programms angelegt. Das einzige was passiert ist, das der Stackpointer um den Betrag weitergeschoben wird und am Ende des Scopes der Variablen wieder zurueckgeschoben wird.

Ausserdem wuerde ich mir darum keine Gedanken machen:
a) optimiert es der Compiler
b) ist diese Schleife mit an Sicherheit grenzender Wahrscheinlichkeit irrelevant fuer die Performance deines Programms

5

23.04.2011, 11:33

Ok, wieder was dazu gelernt, dankeschön :)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

23.04.2011, 11:41

Könnte aber auch gut sein, dass sich die Variable in einem Register aufhält. Da werden dann nicht einmal vergleichsweise teure Stackoperationen benutzt.

moritz31

Treue Seele

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

7

23.04.2011, 12:30

Soll man dann auch bei SFML alles vor der

C-/C++-Quelltext

1
while(App.IsOpen())


Schleife anlegen?

Oder geht das dann auch in der Schleife in Ordnung?

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

8

23.04.2011, 12:54

Grundsätzlich gilt das ja für alle Schleifen. Also natürlich auch für die SFML-Schleife. Allerdings ist ein SFML-Programm ja meist etwas komplexer. Aber grundsätzlich ist es auf jeden Fall nicht verkehrt, wenn man darauf achtet, dass man nicht unnötig irgendwelche Variablen ständig neu erstellt, obwohl auch ein einziges Mal reichen würde(auch wenn der Kompiler da oft vieles wegoptimiert, so dass der Unterschied vmtl. marginal ist).
Ein gutes Beispiel ist denke ich, dass man darauf achten sollte, dass man nicht bei jeden Schleifendurchgang ein sf::Image neu lädt(das kann allerdings auch passieren, wenn man das Image nicht neu erstellt); da geht die Frame-Rate auf jeden Fall ziemlich in den Keller ;).

moritz31

Treue Seele

Beiträge: 259

Wohnort: Hessen

Beruf: Student

  • Private Nachricht senden

9

23.04.2011, 12:59

ok danke für die antwort,
das mit der framerate hab ich schon bei meinem ersten kleinen SFML programm zu
spüren bekommen. Da habe ich nämlich wie du gesagt hast bei jedem Schleifendurchlauf
alles neu geladen^^

rnlf

Frischling

Beiträge: 85

Beruf: Softwareingenieur Raumfahrt

  • Private Nachricht senden

10

25.04.2011, 11:53

Ich denke, man sollte in solchen Fällen lieber auf die Struktur und Lesbarkeit des Programms achten als auf irgendwelche MIrkooptimierungen, die der Compiler genauso übernehmen kann.
Das bedeutet: Variable entsprechend ihres Scopes definieren. Wird ihr Wert ausschließlich in einem Schleifendurchlauf gebraucht, pack die Variable in die Schleife. Muss der Wert über mehrere Durchläufe erhalten bleiben, pack sie nach außen.

Ob das jetzt tatsächlich eine Stackoperationen mehr oder weniger ausmacht, darum darf sich schön der Compiler kümmern. Anders wird es, wenn ein komplexerer Konstruktor aufgerufen wird. Dann darf man auch mal von der Lesbarkeitsregel abweichen...

Werbeanzeige