🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.lang.c++
5 messages
5 total messages Started by Ruediger Berlich Sun, 10 Mar 1996 14:32
Ein paar Fragen
#1797
Author: Ruediger Berlich
Date: Sun, 10 Mar 1996 14:32
64 lines
2506 bytes
Hallo,
ich habe ein paar Fragen :
- Ist es durchweg ratsam, alle Z"ahl-Variablen als
  'register' zu deklarieren ? Oder sollte man sich da nur auf die
  wichtigsten (am h"aufigsten gebrauchten) beschr"anken ?
  Ich stelle mir vor, dass ja immer nur eine beschr"ankte Anzahl von
  Variablen die Register des Prozessors belegen kann. Bremst man so nicht
  das ganze Programm aus ? Oder ist 'register' nur eine Empfehlung an
  den Compiler ?
- Mir wurde erz"ahlt, dass auf modernen (>= 32 Bit-) Rechnern intern alle 
  floatingpoint-Zahlen als double dargestellt sind, sodass Programme,
  die nur mit double arbeiten, schneller sind, da floats intern umgewandelt
  werden m"ussen. Stimmt das und gilt dasselbe dann auch f"ur int/long ?
- Wenn ich etwa die folgenden (Member-)Funktionen/Klassen deklariere/definiere :
  (schwachsinnig, ich weiss, soll nur ein Beispiel sein)

===============================================

class matrix
{
public:
 matrix(long, long);
 matrix(const matrix&);
...
 matrix& giveBackMatrix(void);
 matrix& operator=(const matrix&);
 matrix& operator=(double); // Soll Matrix mit dem Argument initialisieren
private:
...
};

matrix& matrix::giveBackMatrix(void)
{
matrix z(*this);
return z;
}

main()
{
matrix x(3,3),y(3,3);
x=1.;
y=0.;
...
y=x.giveBackMatrix();
}

=============================================

 w"are dann sichergestellt, dass 'z' als lokale Variable lange genug
 lebt, um operator= auszuf"uhren ? W"urden dann in y also lauter
 '1.' stehen ? Oder w"are das Ganze undefiniert ?
 Anders ausgedr"uckt, wie kann ich bei der R"uckgabe einer Referenz
 vermeiden, den R"uckgabewert (z) mit 'new' anlegen zu m"ussen 
 (==> explizites L"oschen notwendig) ?

Danke f"ur Eure Hilfe,
R"udiger
[berlich@pc66.mppmu.mpg.de]

P.S. : Sorry, ich poste diesen Artikel nicht von meinem normalen Host
(in M"unchen). Es k"onnte deshalb sein, dass die im Header des Artikels
angegebene Adresse nicht stimmt (Erscheint hier im 'vi' vom 'tin' aus
nicht). Ich bin jedoch unter der oben angegebenen Adresse -- pc66 --
zu erreichen.
Re: Rueckgabe v. Referenz auf lokale Variable [[was: Re: Ein paar Frag
#1805
Author: Claus A. Faerber
Date: Sun, 10 Mar 1996 00:00
65 lines
2090 bytes
Ruediger Berlich <berlichr@afal23.cern.ch> (10.03.96):

> Hallo,
> - Wenn ich etwa die folgenden (Member-)Funktionen/Klassen
> deklariere/definiere :   (schwachsinnig, ich weiss, soll nur ein Beispiel
> sein)
>
> ===============================================
>
> class matrix
> {
> public:
>  matrix(long, long);
>  matrix(const matrix&);
> ...
>  matrix& giveBackMatrix(void);
>  matrix& operator=(const matrix&);
>  matrix& operator=(double); // Soll Matrix mit dem Argument initialisieren
> private:
> ...
> };
>
> matrix& matrix::giveBackMatrix(void)
> {
> matrix z(*this);
> return z;
> }
>
> main()
> {
> matrix x(3,3),y(3,3);
> x=1.;
> y=0.;
> ...
> y=x.giveBackMatrix();
> }
>
> =============================================
>
>  w"are dann sichergestellt, dass 'z' als lokale Variable lange genug
>  lebt, um operator= auszuf"uhren ?

Nein, die lokale Variable muss geloescht werden, bevor die  
Funktion zurueckkehrt; operator= wird erst nach der  
Rueckkehr aufgerufen.

>  W"urden dann in y also lauter
>  '1.' stehen ? Oder w"are das Ganze undefiniert ?

Ja.

>  Anders ausgedr"uckt, wie kann ich bei der R"uckgabe einer Referenz
>  vermeiden, den R"uckgabewert (z) mit 'new' anlegen zu m"ussen
>  (==> explizites L"oschen notwendig) ?

Lass' doch einfach das '&' beim Rueckgabewert weg, dann wird  
das ganze nicht als Referenz sondern als Kopie (mit new  
angelegt) uebergaben; aber der Compiler kuemmert sich  
implizit um das Loeschen.

Claus

------------------------------------------------------------------------
Claus Andre Faerber - claus@faerber.muc.de - http://www.muc.de/~cfaerber
------------------------------------------------------------------------
Re: register [[was: Re: Ein paar Fragen
#1806
Author: Claus A. Faerber
Date: Mon, 11 Mar 1996 00:00
23 lines
1382 bytes
Ruediger Berlich <berlichr@afal23.cern.ch> (10.03.96):

> Hallo,
> ich habe ein paar Fragen :
> - Ist es durchweg ratsam, alle Z"ahl-Variablen als
>   'register' zu deklarieren ? Oder sollte man sich da nur auf die
>   wichtigsten (am h"aufigsten gebrauchten) beschr"anken ?
>   Ich stelle mir vor, dass ja immer nur eine beschr"ankte Anzahl von
>   Variablen die Register des Prozessors belegen kann. Bremst man so nicht
>   das ganze Programm aus ? Oder ist 'register' nur eine Empfehlung an
>   den Compiler ?

So ist es. Das Schluesselwort 'register' sagt dem Compiler  
nur, dass es hier besonders effizient waere, die Variable in  
einem Register zu speichern, weil sie oft benutzt wird. Ob  
der Compiler das dann macht (machen kann) und ob und wie er  
ohne 'register' trotzdem Register benutzt ist seine Sache.

Claus

------------------------------------------------------------------------
Claus Andre Faerber - claus@faerber.muc.de - http://www.muc.de/~cfaerber
------------------------------------------------------------------------
Re: double schneller als float? [[was: Re: Ein paar Fragen
#1807
Author: Claus A. Faerber
Date: Mon, 11 Mar 1996 00:00
26 lines
1605 bytes
Ruediger Berlich <berlichr@afal23.cern.ch> (10.03.96):

> - Mir wurde erz"ahlt, dass auf modernen (>= 32 Bit-) Rechnern intern alle
>   floatingpoint-Zahlen als double dargestellt sind, sodass Programme,
>   die nur mit double arbeiten, schneller sind, da floats intern umgewandelt
>   werden m"ussen. Stimmt das und gilt dasselbe dann auch f"ur int/long ?

Die Koprozessoren von intel 80x86-Prozessoren arbeiten  
intern ausschliesslich mit 80 Bit, also 'long double'.
'float' und 'double' sind also, da sie beide intern  
umgewandelt werden, etwa gleich schnell.
'long double's sind interesanterweise sogar langsamer, weil  
sie im Gg.satz zu 'float' und 'double' bei einigen Befehlen  
(zB. FADD, floating p. add) nicht direkt aus dem Speicher  
gelesen werden koennen, sondern erst mit einem separaten  
Befehl geladen werden muessen.

'int' und 'long' sien auf intel 32-Bit-Systemen etwa gleich  
schnell, auf anderen 32-Bittern kann es wirklich sein, dass  
die Konvertierung einen Geschwindigkeitsnachteil bringt.

Claus

------------------------------------------------------------------------
Claus Andre Faerber - claus@faerber.muc.de - http://www.muc.de/~cfaerber
------------------------------------------------------------------------
Re: Ein paar Fragen
#1796
Author: Oliver Rebach
Date: Mon, 11 Mar 1996 07:47
76 lines
4021 bytes
Moin Ruediger,

In article <Do2325.Fwu@news.cern.ch>, berlichr@afal23.cern.ch (Ruediger Berlich) writes:
|> Hallo,
|> ich habe ein paar Fragen :
|> - Ist es durchweg ratsam, alle Z"ahl-Variablen als
|>   'register' zu deklarieren ? Oder sollte man sich da nur auf die
|>   wichtigsten (am h"aufigsten gebrauchten) beschr"anken ?
|>   Ich stelle mir vor, dass ja immer nur eine beschr"ankte Anzahl von
|>   Variablen die Register des Prozessors belegen kann. Bremst man so nicht
|>   das ganze Programm aus ? Oder ist 'register' nur eine Empfehlung an
|>   den Compiler ?

register ist eine Empfelung (muss es auch sein, man denke nur daran, dass
irgentwann einmal ein Zeiger auf die Variable verlangt wird. Dann muss sie
zwangslaeufig als "normale" Speichervariable angelegt werden). I.d.R. ist
es auch nicht notwendig (bzw. sinnvoll) sich darueber Gedanken zu machen, 
welche Variablen in Registern gehalten werden sollen. Ein optimierender 
Compiler macht das automatisch (und meistens besser als der Programmierer).
Sinnvoll ist es hoechsten, wenn man durch profilen des Otimierten 
Programm signifikante Performance-Maengel festgestellt hat.

|> - Mir wurde erz"ahlt, dass auf modernen (>= 32 Bit-) Rechnern intern alle 
|>   floatingpoint-Zahlen als double dargestellt sind, sodass Programme,
|>   die nur mit double arbeiten, schneller sind, da floats intern umgewandelt
|>   werden m"ussen. Stimmt das und gilt dasselbe dann auch f"ur int/long ?

Wie die eingebauten Datentypen dargestellt werden, ist Sache der Compiler-
bauer. Der Standard schreibt lediglich vor:
sizeof(long)>=sizeof(int)>=sizeof(char)=1
Das laesst sogar die Moeglichkeit zu alle Ganzzahligen Werte 32bit zu codieren.
Die kleinste anzusprechende Speichereinheit ist dann 4 Byte. Fuer Float
und double gilt analoges. Gerade wenn float und double intern identisch
sind faellt uebrigens die Umwandlung weg. Bei der Benutzung von Bibliotheken
gilt: Wenn man die Datentypen nutzt, die im Funktions-/Methodenaufruf 
gewuenscht werden, ist das Programm i.d.R. minimal schneller. Typwandlungen
sollte man nur fuer die Faelle benutzen, in denen es triftige Gruende gibt
andere als die in den Bibliotheken benutzten Typen zu verwenden (Haupt-
argument hierfuer ist aber, der gerade impliziete Typwandlungen dazu neigen,
zweideutig zu sein).

|> - Wenn ich etwa die folgenden (Member-)Funktionen/Klassen deklariere/definiere :
|>   (schwachsinnig, ich weiss, soll nur ein Beispiel sein)
|> 
[Beispiel geloescht]
|> 
|>  w"are dann sichergestellt, dass 'z' als lokale Variable lange genug
|>  lebt, um operator= auszuf"uhren ? 

Definitiv nein.
|>W"urden dann in y also lauter
|>  '1.' stehen ? Oder w"are das Ganze undefiniert ?

Definitv ja: Der Stack wird beim return aufgraeumt, also sind die localen
Variablen dann weg.

|>  Anders ausgedr"uckt, wie kann ich bei der R"uckgabe einer Referenz
|>  vermeiden, den R"uckgabewert (z) mit 'new' anlegen zu m"ussen 
|>  (==> explizites L"oschen notwendig) 

Keine Referenz sondern ein Objekt zurueckgeben. Du musst ohnehin irgendwann
dieses Objekt erzeugen (siehe z in deinem Beispiel). Es nuetzt nichts, man
darf seine Daten nicht wegoptimieren.

|> 
|> Danke f"ur Eure Hilfe,
|> R"udiger

Bitte schoen
Oliver

-- 
O. Rebach <Oliver.Rebach@UniBw-Hamburg.DE>                /|\  /|\
Universitaet der Bundeswehr Hamburg FB Maschinenbau      / | \/ |
Fachgebiet Maschinenelemente und Getriebetchnik         |--|    | ~|
- CAD - Labor -                                            |    | /
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads