[linux-l] Re: Function Pointer in C

Steffen Dettmer steffen at dett.de
Do Jun 16 23:08:49 CEST 2005


* Rocco Rutte wrote on Wed, Jun 15, 2005 at 07:47 +0000:
> * Steffen Dettmer [05-06-15 00:36:23 +0200] wrote:
> 
> > Das static nimmt ja nur das implizite "this" weg, also der erste
> > Parameter. Dafür musst Du sicherlich irgendeine Referenz auf die
> > eigentlichen Daten übergeben, summa sumarum das gleiche.
> 
> Jein, bzw. ich weiss es nicht. Es gibt zum Beispiel die Methode 
> toString() aus Object. Wenn ich jetzt ein beliebiges Objekt erzeuge und 
> die Methode nicht überschreibe, dann weiss ich nicht wie das intern 
> organisiert wird. 

Die Referenz in der VMT zeigt auf den Code von Object::toString() (oder
eben Object.toString()). Der Code selbst ist natürlich nach wie vor nur
einmal da. Wie im C++ Beispielcode gezeigt, benötigt die VMT nur eine
Referenz (z.B. 4 Byte) je Instanz plus ca. 4 * virutelle Methoden je
Klasse. Der Code belegt n Byte je Implementierung.

> Werden dann immer die Implementierungen der Superklassen per Pointer
> genommen 

Natürlich.

> oder wird vom toString()-Code eine Kopie erzeugt und in den
> Speicher meiner Klasse eingefügt so dass die gleiche Methode
> toString() für alle Instanzen separat verfügbar ist? 

Nein. Der Code ist i.d.R. nicht einmal kopierbar (man denke an JNI
Funktionen bzw. das "untere Level", was dann irgendwas in C ist - die C
Funktion kann man ja nicht in Java kopieren können!).

> Ich weiss, dass das etwas verwirrend klingt, weshalb es mir vielleicht
> auch noch niemand richtig erklären konnte. ;-)

Na ja, man lernt viel, wenn man sich ein C++-Ultra-Light mal in C
nachbauen muss :)

> Und weil ich es bisher immernoch nicht weiss, mache ich immer
> "static".

Tja, aber das ist halt in jedem Fall falsch, aber es spart evtl. 4 byte
je Instanz. Ach nee, in Java wird Object ja immer beerbt IIRC, damit ist
die VMT eh dann. Aber wenn Du gar keine Instanzen verwendest, passt's
wieder, aber ich glaub nicht, dass das merklich schneller/schlanker
wird.

> Ich muss dann zwar Sachen übergeben, weiss aber, dass alle Methoden
> pro Laufzeit genau einmal im Speicher sind und nicht bei jedem Objekt
> neu generiert werden.

In Java kann es nervig kompliziert werden, irgendwas zu kopieren, weil
man eigentlich ja nur Referenzen kopiert (also 4 bytes), nicht mal
pass-by-value geht, ausser bei ints, so ganz geschlossen kommt mir das
alles nicht vor ;)

In C++ kann man kopieren explizit verbieten (private copy-constructor,
...) aber kann trozdem verschiedene Instanzen haben (aber dann halt
nicht mehr by-value übergeben, klar).

> Streng genommen macht es eigentlich gar keinen Sinn, dass man ein neues 
> Objekt vollständig zusammenbaut, indem man ihm alle nicht-geänderten 
> Methoden aus den übergeordneten Klassen als Implementierung mitgibt, 
> aber...

Warum nicht, welche Methoden sollte es denn sonst haben? Wenn ein Animal
ein getAge() und ein Eat() hat, eine Cat nur Eat() überschreibt, erwarte
ich doch in jedem Fall, dass getAge() funktioniert (schliesslich ist
eine Katze ja ein Tier, und da jedes Tier ein Alter hat, muss doch auch
die Katze ein Alter haben).

oki,

Steffen

-- 
Dieses Schreiben wurde maschinell erstellt,
es trägt daher weder Unterschrift noch Siegel.



Mehr Informationen über die Mailingliste linux-l