Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » lokale variablen unklarheit

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
04.11.2004, 20:19 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von Windalf:
höchstens eine inlinefunktion (das ist eine die nicht wirklich ausgeführt wird sondern da wird der code einfach hinkopiert...

Nur um mal drauf hinzuweisen bzw. Klug zu scheißen: IMHO muss der Compiler ein inline nicht beachten sondern kann das nach eigenem gutdenken hin oder weg optimieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
04.11.2004, 21:09 Uhr
Lensflare




Zitat von Windalf:

du kannst dein programm auch selber optimieren und in assembler schreiben


öhm... kein plan was du damit meinst

aber wenn ich die wahl hab zwischen dem einen nachteil und dem andern dann wähle ich lieber die etwas langsamere geschwindigkeit und habe dafür lieber meine übersicht und ordnung :o)
Aber nur wenns nicht extrem viel langsamer ist


Zitat von Windalf:

oder wenn du es in c machst kannst du auch alles in die mainfunktion kloppen...


so hab ich es bisher gemacht. Deswegen lerne ich jetzt auch C++ in der hoffnung mit klassen und objekten das ganze chaos und die unleserlichkeit meiner zukünftigen programme zu vermeiden

wenn ich nur an meine variablennamen denke die zB so aussahen:

C++:
int spieler_4_autofarbe_rot = 255;
int spieler_4_autofarbe_gruen = 255;
int spieler_4_autofarbe_blau = 0;


schön nicht?

wegen inlinefunktion:
sorry, aber ich raff immer noch nicht was man darunter zu verstehen hat
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
04.11.2004, 21:29 Uhr
(un)wissender
Niveauwart


Man Leute, hat sich hier noch niemand ein x86-Disassembly angesehn? Da bremst gar nichts, 100% Pro, das die einzigen Kosten für diese Funktion allerhöchstens mov eax,5 sind, vermutlich noch nicht einmal das, weil die Funktion ein konstantes Verhalten zeigt, wird die ganze Schleife wegoptimiert.
Wie lokale Variablen angelegt werden ist undefiniert, wenn geht sind sie gar nicht vorhanden, sondern temporär als Registerwert gespeichert oder sie liegen auf dem Stack, der ziemlich sicher im L1-Cache liegt. sub esp, 4 und schon habe ich meinen 32Bit-Variabel.
"Zerstören" der Varibale mit add esp,4, fertig


Bearbeitung:

Ah, da die Schleife eine Endlosscheife ist, kann der Compiler sie nicht rausnehmen, aber vermutlich nichts in ihr tun.
Schau euch mal ein paar Disassembly an, da verschwinden oft ganze Klassen zu nichts, weil alles geinlined wird.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 04.11.2004 um 21:32 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
04.11.2004, 22:17 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


du meinst "geinlined bzw gar nicht gebraucht wird" oder?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
04.11.2004, 23:47 Uhr
Hans
Library Walker
(Operator)



Zitat von (un)wissender:
Man Leute, hat sich hier noch niemand ein x86-Disassembly angesehn?


Doch ich jetzt Hab mir mal eines gemacht, bzw. den Borland-Compiler eines machen lassen. Das kam im wesentlichen das bei raus:

Code:
DGROUP    group    _BSS,_DATA
_TEXT    segment dword public use32 'CODE'
_main    proc    near
?live1@0:
   ;    
   ;    int main()
   ;    
    push      ebp
    mov       ebp,esp
   ;    
   ;    {
   ;      
   ;    /*
   ;    * while-Schleife
   ;    */
   ;      while(1)
   ;      {
   ;        funktion();
   ;    
@1:
@2:
    call      _funktion
    jmp       short @2
   ;    
   ;      }
   ;    
   ;      return 0;
   ;    
    xor       eax,eax
   ;    
   ;    }
   ;    
@4:
    pop       ebp
    ret
_main    endp
_funktion    proc    near
?live1@80:
   ;    
   ;    int funktion()
   ;    
    push      ebp
    mov       ebp,esp
   ;    
   ;    {
   ;      int a;
   ;      a = 5;
   ;    
@5:
    mov       eax,5
   ;    
   ;      return a;
   ;    
?live1@112: ; EAX = a
   ;    
   ;    }
   ;    
?live1@128: ;
@7:
@6:
    pop       ebp
    ret
_funktion    endp
_TEXT    ends
    end



Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
05.11.2004, 00:06 Uhr
~Mr. T
Gast


[/quote]
wegen inlinefunktion:
sorry, aber ich raff immer noch nicht was man darunter zu verstehen hat :\[/quote]

inline Funktionen sind Funktionen, die nicht "wirklich" welche sind.
Wenn eine Funktion in c++ z.b. nur einen Wert einer private oder protected Variablen zurück gibt (also sehr kurz ist):

C++:
CKlasse
{
public:
//noch andere Methoden, Konstruktor, etc...
int Lesen();
private:
int wert;
}
...
...
int CKlasse::Lesen()
{
      return(wert);
}



So würde das Programm die Funktion Aufrufen, den Wert auslesen und aus der Funktion zurück, zb ins main() kommen --> Zeitverlust

Inline ist eine Empfehlung des Programmierers an den compiler, eine Funktion direkt durch zB sein Ergebnis zu ersetzen.

also: mit schlüsselwort inline int Lesen()... Dann wird die Funktion zwar compiliert, aber nicht immer bei Verwendung aufgerufen, sondern immer an der Stelle, wo sie aufgerufen wurde das Ergebnis z. B. direkt vom compiler eingesetzt. So fällt die Aufrufzeit für die Funktion flach. --> weniger Zeitverlust.

Wenn Du eine Methode innerhalb der Klassendeklaration ausprogrammierst, musst Du das schlüsselwort inline nicht benutzen, da geht dann der compiler davon aus, dass es eine inline Funktionsempfehlung ist.


C++:
CKlasse
{
public:
//noch andere Methoden, Konstruktor, etc...
int Lesen(){return(wert);};
private:
int wert;
}
...
...



inline ist aber wie gesagt nur eine empfehlung, ob der compiler das dann so auch umsetzt, ist nur in seinen Händen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
05.11.2004, 00:33 Uhr
Lensflare



aha... gut zu wissen.

ist das auch ne inline funktion?

C++:
void SetValue(int a) { klassenvariable = a; };


--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
05.11.2004, 00:35 Uhr
Lensflare



achja nochwas... wieso soll man den nur über methoden auf klassenvariablen zugreifen?
Nicht das es ein problem wäre... nur aus neugier.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
05.11.2004, 07:39 Uhr
(un)wissender
Niveauwart


@Hans
Bei einem optimierenden Compiler sieht das anders aus, ich vermute du hast die freie CommandLine-Version des bcc 5.51 (oder so ähnlich). Der optimiert nahezu überhaupt nicht.
Der Vc .NET 2003 macht das ganze mit nur einem Befehl:

Code:
00420770  jmp         main+10h (420770h)



Da die Endlosschleife nicht wegoptimiert werden darf, gibt es einfach einen Sprung auf sich selber. Wäre die Schleife begrenzt, würden genau 0 Befehle gebraucht.
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 05.11.2004 um 07:40 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
05.11.2004, 08:52 Uhr
derphilipder




Zitat von Lensflare:
aha... gut zu wissen.

ist das auch ne inline funktion?

C++:
void SetValue(int a) { klassenvariable = a; };




Nein, zumindest nicht explizit.


C++:
inline void SetValue(int a) { klassenvariable = a; }



Jetzt ist es eine.
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"

Dieser Post wurde am 05.11.2004 um 08:53 Uhr von derphilipder editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: