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 <
020
05.11.2004, 09:27 Uhr
Mr. T




Zitat von Lensflare:
achja nochwas... wieso soll man den nur über methoden auf klassenvariablen zugreifen?
Nicht das es ein problem wäre... nur aus neugier.


So stellt man sicher, dass Variablen nur von den Methoden Verändert werden können, die Du vordefinierst. Auf Globale Variablen könnten alle zugreifen und sie verändern. Auf lokale nur die eine Funktion. Wenn sie als Parameter übergeben werden, kostet das kopieren für die nächste Funktion Zeit. (Mal abgesehen von Pointerübergabe)

Solche Methoden kopieren aber nicht die Klassenvariablen sondern greifen immer direkt darauf zu, weil Du sie eben als "Zugriffsberechtigt" in der Klasse angibst. Da gibte es dann noch friends und Vererbung und so weiter, so dass auch Methoden anderer Klassen auf die Variablen zugreifen können.

Das ganze nennt man dann glaube ich auch Kapselung und ist so der Grundgedanke des Objektorientierten Programmierens.
--
So ist das!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
05.11.2004, 10:22 Uhr
(un)wissender
Niveauwart


1. Auch Pointer müssen kopiert werden
2. Vielleicht wird gar nichts kopiert, sondern alles in Registern gehalten
3. Große Objekte sollte man immer per Referenz/Pointer übergeben
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
05.11.2004, 14:35 Uhr
Mr. T




Zitat von (un)wissender:

1. Auch Pointer müssen kopiert werden
2. Vielleicht wird gar nichts kopiert, sondern alles in Registern gehalten
3. Große Objekte sollte man immer per Referenz/Pointer übergeben




Jawohl, 1. und 3. meine ich auch so. Vielleicht etwas unverständlich ausgedrückt.

Aber was ist mit 2. gemeint?
--
So ist das!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
05.11.2004, 16:09 Uhr
virtual
Sexiest Bit alive
(Operator)


@Mr T
Er meinte Prozessoregister. Die sind schneller als ordinäre Speicherzugriffe. Dabei muß man aber sehen, daß moderne Prozessoren pipelining haben, was diesen Effekt deutlich abschwächt oder sogar unerheblich machen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
05.11.2004, 16:17 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Windalf:

Zitat:

Sie wird tatsächlich jedes mal "gelöscht" und neu deklariert? Kostet das nicht zeit?
Das bremst doch mein programm ab, oder?


Ja

Ich denke, daß das Nein soweit überwiegt, daß die Antwort eher nein lauten muß..
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
05.11.2004, 23:35 Uhr
Hans
Library Walker
(Operator)



Zitat von (un)wissender:
@Hans
Bei einem optimierenden Compiler sieht das anders aus, ich vermute du hast die freie CommandLine-Version des bcc 5.51 (oder so ähnlich).

Ja; Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland

Zitat:
Der optimiert nahezu überhaupt nicht.

Doch schon, aber nicht sehr viel. Mit allen Optimierungsoptionen an wird daraus das hier:

Code:
_main    proc    near
?live1@0:
   ;    
   ;    int main()
   ;    {
   ;      
   ;    /*
   ;    * while-Schleife
   ;    */
   ;      while(1)
   ;      {
   ;        funktion();
   ;    
@1:
@2:
    call      _funktion
    jmp       short @2
   ;    
   ;      }
   ;    
   ;      return 0;
   ;    
    xor       eax,eax
   ;    
   ;    }
   ;    
@4:
    ret
_main    endp
    align    4
_funktion    proc    near
?live1@64:
   ;    
   ;    int funktion()
   ;    {
   ;      int a;
   ;      a = 5;
   ;    
@5:
    mov       eax,5
   ;    
   ;      return a;
   ;    }
   ;    
@7:
@6:
    ret
_funktion    endp


Dann hab ich noch einen Visual Age C++ Compiler von IBM, der mach mit allen Optimierungsoptionen das hier:

Code:
[E:\ibmcpp\working]icc /Fa+ /G4 /O+ /Oc+ /C+ endloslp.c
IBM VisualAge C ++ for OS/2, Version 3
(C) Copyright IBM Corp. 1991, 1995.
- Licensed Materials - Program Property of IBM - All Rights Reserved.

endloslp.c(14:9) : informational EDC0424: The condition is always true.
endloslp.c(16:5) : warning EDC0304: No function prototype given for 'funktion'.

[E:\ibmcpp\working]
---------------------------------------------------------------------
CODE32    segment

    public funktion
funktion    proc

; 29   return a;
    mov    eax,05h
    ret    
funktion    endp

    public main
main    proc

; 14   while(1)
@BLBL2:

; 16     funktion();
    call    funktion

; 14   while(1)
    jmp    @BLBL2
main    endp
CODE32    ends
end



Zitat:
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.

Ja gut, da können meine Compiler nicht mithalten... - aber dafür sind sie auch schon ein paar Jährchen alt. Und der IBM-Compiler optimiert doch schon mehr, als der von Borland. Aber insgesamt gesehen haben sie wirklich nicht die nötige KI eingebaut, um die nutzlose Funktion komplett weg zu optimieren.

Hans

P.S. mir kommt da gerade noch 'ne andere Frage: Nehmen wir mal an, die Variable a in der Funktion sei mit volatile deklariert, und würde ein Hardwareregister repräsentieren. Dann bräuchte die Funktion nur etwa so aussehen:

C++:
int funktion()
{
   volatile int a;

   return a;
}


und der Compiler dürfte gar nichts dran optimieren, oder?
Eine andere Frage wäre in diesem Zusammenhang noch, wo steht welches Register denn in a stehen sollte, aber dazu sollte man einen neuen Thread anfangen...
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 05.11.2004 um 23:40 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
08.11.2004, 21:45 Uhr
(un)wissender
Niveauwart



Zitat von virtual:

Die sind schneller als ordinäre Speicherzugriffe. Dabei muß man aber sehen, daß moderne Prozessoren pipelining haben, was diesen Effekt deutlich abschwächt oder sogar unerheblich machen.



Das sehe ich nicht so. Der Speicher ist weiterhin ein Flaschenhals und jeder Zugriff weniger ist Gold wert (zumindest bei einem Cachemiss). Der Stack (aber ein Teil davon) ist vermutlich im Cache, trotzdem ist die Registerübergabe deutlich schneller. Das Pipelining kann den langsamen Hauptspeicher generell nicht negieren, es können zwar normalerweise noch wenige Befehle abgearbeitet werden (bei geschikcter Anordnung der Befehle), bis der aus dem Speicher gelesene Wert wirklich gebraucht wird, aber der Speicher ist sooo langsam, dass das nicht mehr ins Gewicht fällt.


Bearbeitung von Windalf:

Ich hab mir mal erlaubt deine cpp-tags in quotetags umzuwandeln damit das auch richtig mit dem zitat funzt


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

Dieser Post wurde am 08.11.2004 um 21:52 Uhr von Windalf 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: