Als Zeiger oder als Wert?

Hallo Leute,

in diesem Buch
http://www.amazon.de/Effektiv-programmieren-Verbesse…

wird folgendes abgeraten (deklarieren von Rechteck-Werten), da es lange Wartezeiten beim Kompilieren nach sich zieht:

// rect.h

class Rect
{ // int left, int right, etc.
 Rect(const &Rect re) {}
};

// any.h

class Any
{
 private:
 Rect Re;
 public:
 Any(Rect re) : Re(re)
 {}
};

Der Compiler weiß ja nicht, wie groß ein Rechteck ist, und braucht daher die Quelle, um das festzustellen.
Würde man aber seine Rechtecke u.a. generell als Zeiger deklarieren (und die #include nur in der main.cpp schreiben), sind die 4 Bytes Groesse von diesem ja bekannt, und das Kompilieren wird dadurch beschleunigt.

Das hört sich nun sehr einleuchtend an. Es erheben sich aber zwei Fragen:

Er meint wohl nur die Member-Variablen, nicht die Funktions-Argumente und Rückgabe-Werte? Diese können ruhig auch als Wert übergeben werden, da sie für „sizeof(Any)“ unerheblich sind, richtig?

Wenn die „rect.h“ schon vorkompiliert ist, wo ist dann das Problem? Dann müsste die „sizeof(Rect)“ ja bekannt sein. Der Compiler merkt das ja an Datum und Uhrzeit der Datei, daß er die „rect.h“ nicht mehr zu kompilieren braucht.

lg
Martin B

Hallo,

wenn ich dich richtig verstanden habe ist die ganze Fragestellung ziemlich sinnlos. Man richtet keine Design-Entscheidungen danach wie lange das kompilieren des Programms dauert.

Man wählt die Abstraktion, die am besten zum lösen des Problems passt.

Grüße,
Moritz

Hallo Martin,

Ich übertrage dem Compiler jede Menge an Arbeit !!!

Allerdings sind meine Projekte in mehrere Module zerlegt und ich verwende ein gutes Make-Tool und ein paar Tricks.

Die meisten meiner Programme laufen auf Microcontrollern, da macht es von der Laufzeit und dem Speicherplatz her Sinn, vieles dem Compiler zu übertragen.

MfG Peter(TOO)

Hallo Leute,

wenn ich dich richtig verstanden habe ist die ganze
Fragestellung ziemlich sinnlos. Man richtet keine
Design-Entscheidungen danach wie lange das kompilieren des
Programms dauert.

Wenn ich Rechtecke als Wert übergebe, hat das Vorteile, ich kann dann

Rechteck(8, 8, 100, 40)

übergeben, bei Zeigern geht das nicht. Die Frage war so gemeint: zieht diese Bequemlichkeit längere Kompilierzeiten nach sich?

danke an alle
lg
Martin B

Hallo Martin,

Wenn die „rect.h“ schon vorkompiliert ist, wo ist dann das
Problem? Dann müsste die „sizeof(Rect)“ ja bekannt sein. Der
Compiler merkt das ja an Datum und Uhrzeit der Datei, daß er
die „rect.h“ nicht mehr zu kompilieren braucht.

Das Ganze basiert auf der Überlegung, was passiert, wenn sich eine Header-Datei ändert. Dann müssen alle *.h und *.cpp Dateien, die den Header „Rect.h“ direkt includieren, compiliert werden, z.B. „any.h“. Dies hat zur Folge, dass Dateien, die „any.h“ includieren, auch neu compiliert werden. Dies pflanzt sich so fort, bis bei einem schlechten Design alles neukompiliert werden muss.

Um dem abzuhelfen, wird die „include“-Anweisung ins cpp verschoben und in der any.h Datei taucht nur ein „class Rect;“ auf. Auf diese Weise muss „any.h“ nicht neu compiliert werden, falls „Rect.h“ sich ändert.

Es geht nur darum, wieviel muss compiliert werden, falls es eine Änderung gibt.

Solche Techniken machen bei großen Projekten Sinn. Falls sie zu häufig eingesetzt werden, führen sie aber zu schlecht lesbaren Code, daher muss man die Technik mit Bedacht einsetzen.

Grüße
Thorsten

Hallo McGee,

der Compiler merkt das ja an Datum und Uhrzeit der Datei, daß er
die „rect.h“ nicht mehr zu kompilieren braucht.

Das Ganze basiert auf der Überlegung, was passiert, wenn sich
eine Header-Datei ändert. Dann müssen alle *.h und *.cpp
Dateien, die den Header „Rect.h“ direkt includieren,
compiliert werden, z.B. „any.h“. Dies hat zur Folge, dass
Dateien, die „any.h“ includieren, auch neu compiliert werden.
Dies pflanzt sich so fort, bis bei einem schlechten Design
alles neukompiliert werden muss.

Aha. Deshalb die includes in der main.cpp.

und in der any.h Datei taucht nur ein
„class Rect;“ auf.

D.h. aber m.W. auch, daß man dann nur Zeiger deklarieren kann.

Auf diese Weise muss „any.h“ nicht neu
compiliert werden, falls „Rect.h“ sich ändert.
Es geht nur darum, wieviel muss compiliert werden, falls es
eine Änderung gibt.

Leuchtet ein. Danke schön.
lg
Martin B