PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ - Variablendeklaration in Schleife


Im Gegensatz
2007-09-20, 16:16:25
Mahlzeit

wenn ich sowas mache:

for( int i = 0; i < 10; ++i )
{
int j = foo();
};
Wird wirklich jedesmal in der Schleife eine Variable j angelegt und wieder gelöscht? Oder macht der Compiler daraus sowas?

int j;
for( int i = 0; i < 10; ++i )
{
j = foo();
};
Ich finde oberes eigentlich schönes, weil man sieht, daß man j nur innerhalb der Schleife braucht - aber wenn das untere "schneller" wäre.

Was ist besser? danke

del_4901
2007-09-20, 16:23:49
Mahlzeit

wenn ich sowas mache:

for( int i = 0; i < 10; ++i )
{
int j = foo();
};
Wird wirklich jedesmal in der Schleife eine Variable j angelegt und wieder gelöscht? Oder macht der Compiler daraus sowas?

int j;
for( int i = 0; i < 10; ++i )
{
j = foo();
};
Ich finde oberes eigentlich schönes, weil man sieht, daß man j nur innerhalb der Schleife braucht - aber wenn das untere "schneller" wäre.

Was ist besser? danke
Variablen sind immer nur in ihrem Scope aktiv. ({})
Einen Grenzfall gibt es jedoch:
for(int i,j; .....)
hier ist es Compilerabhänig, bzw. hängt von den Einstellungen ab. Im C++ Standard ist i und j nur innerhalb der Schleife gültig.

BTW: Keine von beiden Varianten ist schneller.

Coda
2007-09-20, 18:36:08
Variablen in lokalen Skopes werden auf dem Stack angelegt, nicht alloziert. Das ist sozusagen kostenlos.

tokugawa
2007-09-20, 19:19:12
Je nach konkretem Code wird die Variable möglicherweise sogar wegoptimiert, wenn sie gar nicht benötigt wird. Oder sie belegt einfach nur kurzzeitig ein Register.

Gast
2007-09-20, 19:33:20
Und wie findet man sowas raus? Na? Na? Richtig, mit Assembler. :wink:

EcHo
2007-09-20, 19:47:47
In C wars afaik mal anders, zumindest bei einigen Compilern.

Coda
2007-09-20, 20:03:19
In C war was anders?

Gast
2007-09-21, 08:10:46
Danke, ich hatte mal irgendwo gelesen, daß das untere billiger sei, weil die Variable nicht in jedem Durchlauf angelegt werden muß. Aber wenn dies wirklich billiger wäre, könnte der Compiler das einem ja auch abnehmen.

Ich finde es nur schöner, wenn nachher im Debugger o.ä. nicht noch nutzlose Schleifenvariablen irgendwo sicherbar sind, auf der anderen Seite mag ich zusätzliche Deklarationen im Schleifenkopf irgendwie nicht.

Matrix316
2007-09-21, 10:35:35
Es wäre ja ziemlicher Blödsinn, wenn aus der oberen Sache die untere gemacht werden würde, da bei unterer das j auch nach der Schleife noch bekannt wäre und man kein neues j anlegen könnte.

Wobei bei einer While Schleife muss man es ja so wie bei zweiterem Beispiel machen.

malte.c
2007-10-01, 13:03:07
Danke, ich hatte mal irgendwo gelesen, daß das untere billiger sei, weil die Variable nicht in jedem Durchlauf angelegt werden muß. Aber wenn dies wirklich billiger wäre, könnte der Compiler das einem ja auch abnehmen.

Programmier erst mal lesbar, und wenn Du irgendwann ein Geschwindigkeitsproblem hast, dann frag Deinen Profiler, woran's liegt. CodeAnalyst bietet sich dazu an, http://developer.amd.com/downloads.jsp. Und in 99% der Fälle wird es nicht an solchen Feinheiten liegen.

Coda
2007-10-01, 13:43:22
Danke, ich hatte mal irgendwo gelesen, daß das untere billiger sei, weil die Variable nicht in jedem Durchlauf angelegt werden muß. Aber wenn dies wirklich billiger wäre, könnte der Compiler das einem ja auch abnehmen.
Ich denke das war auf new und delete bezogen. Das ist in Innerloops wirklich böse ;)