Overhead von Wrapper-Klassen

10/08/2014 - 14:47 von Jens Müller | Report spam
Hallo zusammen!

Wenn ich, um die Typsicherheit zu erhöhen, fundamentale Datentypen in
Objekten wrappe, hat das Auswirkungen auf Laufzeit und Speicherplatzbedarf?

Beispiel:

class typeTag {};

template< class Tag >
class wrappedInt {
int _value;
public:
wrappedInt( int value ) : _value( value ) {};
int value() { return _value; } const;
wrappedInt< Tag > operator+( wrappedInt< Tag > other ) const
{ return value() + other.value(); }
};

Code wie

typedef wrappedInt< typeTag > myInt;
myIntSum sum = myInt( 1 ) + myInt( 2 );

sollte hinsichtlich der zahlreichen Funktionsaufrufe darin dank Inlining
nicht langsamer sein als das Gleiche mit ints, oder?

Wie sieht es mit Speicherplatz aus? Verbrauchen solche Objekte mehr
Speicher als ein int, beispielsweise, weil noch irgendwelche
Typinformationen an jedes Objekt geschrieben werden?

Klar, das kann auch vom Compiler abhàngen, am meisten interessiert es
mich für aktuelle Versionen von gcc und MSVC.

Danke und Gruß,

Jens
 

Lesen sie die antworten

#1 Thomas Richter
11/08/2014 - 14:49 | Warnen spam
Am 10.08.2014 14:47, schrieb Jens Müller:
Hallo zusammen!

Wenn ich, um die Typsicherheit zu erhöhen, fundamentale Datentypen in
Objekten wrappe, hat das Auswirkungen auf Laufzeit und Speicherplatzbedarf?



Wahrscheinlich, und ja. Ob das eine entscheidende Beeintràchtigung ist,
kann nur ein Profiling entscheiden.

Beispiel:

class typeTag {};

template< class Tag >
class wrappedInt {
int _value;
public:
wrappedInt( int value ) : _value( value ) {};
int value() { return _value; } const;
wrappedInt< Tag > operator+( wrappedInt< Tag > other ) const
{ return value() + other.value(); }
};



Das wird ein Compiler zwar optimieren können, aber es bleibt die
zusàtzliche Verwaltung des Speichers für die Klassen. Je nach Qualitàt
des Compilers wird hier nicht viel Code übrigbleiben, ob der
übriggebliebene Code ausschlaggebend für Deine Anwendung ist kannst nur
Du sagen.

typedef wrappedInt< typeTag > myInt;
myIntSum sum = myInt( 1 ) + myInt( 2 );

sollte hinsichtlich der zahlreichen Funktionsaufrufe darin dank Inlining
nicht langsamer sein als das Gleiche mit ints, oder?



Hàngt vom Compiler und den Compilereinstellungen ab.

Wie sieht es mit Speicherplatz aus? Verbrauchen solche Objekte mehr
Speicher als ein int, beispielsweise, weil noch irgendwelche
Typinformationen an jedes Objekt geschrieben werden?



Typinformationen werden hier nicht benötigt, die Klasse hat ja keine
virtuellen Funktionen und somit ist statischer und dynamischer Typ
identisch. Ob ein Compiler zusàtzlich zu dem Speicherplatz für das int
noch weiteren Speicher benötigt bzw. die Klasse vergrößert ist auch
wiederum vom Compiler abhàngig.

Klar, das kann auch vom Compiler abhàngen, am meisten interessiert es
mich für aktuelle Versionen von gcc und MSVC.



Dann würde ich vorschlagen, das ganze mal in ein halbwegs realistisches
Anwendungsszenario einzubauen und zu messen, ob die Beeintràchtigung der
Ablaufgeschwindigkeit für Dich akzeptabel ist. Das ist die einzige
Methode, wie man dies herausfinden kann. Solange man das ganze nicht
innerhalb einer inneren Schleife benötigt, ist das vermutlich recht egal.

Aber mal anders gefragt: Wozu soll das gut sein? C++ ist nicht Java. Im
Gegensatz zu Java gibt es bei C++ die Gleichberechtigung der Typen. In
C++ kann man alles in einen Container werfen (nicht nur "Klassen" bzw.
Objekte wie in Java) und man kann auch alle Objekte als Exceptions
benutzen ("throw 42;"). Mir ist also nicht klar, wozu das Konstrukt
dienen soll. Wenn es so rechnen soll wie ein int und sich so verhalten
soll wie ein int, dann nimm' doch ein int.

Grüße,
Thomas

Ähnliche fragen