 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Michael Sabo Guest
|
Posted: Tue Dec 09, 2008 3:04 pm Post subject: Gibt es dafür eine logische Erklärung??? |
|
|
Hi
Zeiger sollten doch auf einem 32-Bit-System doch 32-Bit sein (also 4 Bytes)
und auf einem 64-Bit-System 64 Bit (also 8 Bytes), oder gibt es da
Ausnahmeregelungen???
Wie kann es dann sein, dass sizeof(&Class::Member) bei mir 8 zurück gibt???
Speziell bei MSVC. Gibt es da eine Einstellungsmöglichkeit?
Danke für jeden Betrag, da wir hier einen Bug (was hiermit zusammenhängt)
entfernen müssen! |
|
| Back to top |
|
 |
Michael Karcher Guest
|
Posted: Tue Dec 09, 2008 11:44 pm Post subject: Re: Gibt es dafür eine logische Erklärung??? |
|
|
Michael Sabo <Michael.Sabo (AT) gmx (DOT) de> wrote:
| Quote: | Zeiger sollten doch auf einem 32-Bit-System doch 32-Bit sein (also 4 Bytes)
und auf einem 64-Bit-System 64 Bit (also 8 Bytes), oder gibt es da
Ausnahmeregelungen???
Zeiger auf Objekte schon. |
| Quote: | Wie kann es dann sein, dass sizeof(&Class::Member) bei mir 8 zurück gibt???
Zeiger auf Member können größer sein. Funktionsmemberzeiger enthalten |
entweder (nicht-virtuelle Funktion) eine Adresse oder (virtuelle Funktion)
einen Offset in die vtable. Das passt zwar beides in 4 Byte, aber der
Nutzer des Zeigers kann nicht wissen, welche Variante gewählt werden
musste, daher enthalten Pointer-to-member-functions weitere Informationen..
Pointer-to-Datamember sind häufig genauso groß wie size_t, da sie immer
Offsets in Strukturen sind.
#include <iostream>
#include <ostream>
using namespace std;
struct Class {
int Func(void);
int Member;
};
int main(void)
{
Class c;
cout << sizeof(&c) << ',' <<
sizeof(&c.Member) << ',' <<
sizeof(&Class::Func) << ',' <<
sizeof(&Class::Member) << '\n';
}
Gibt unter gcc 4,4,8,4 bzw 8,8,16,8 aus.
| Quote: | Danke für jeden Betrag, da wir hier einen Bug (was hiermit zusammenhängt)
entfernen müssen!
Wenn ihr annehmt, dass ein Pointer-To-Member-Function so groß ist wie |
ein Zeiger, habt ihr ein Design-Problem.
Gruß,
Michael Karcher |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Wed Dec 10, 2008 12:36 am Post subject: Re: Gibt es daf�r eine logische Erkl�rung??? |
|
|
Michael Sabo wrote:
| Quote: | Hi
Zeiger sollten doch auf einem 32-Bit-System doch 32-Bit sein (also 4
Bytes) und auf einem 64-Bit-System 64 Bit (also 8 Bytes),
|
Sagt wer?
| Quote: | oder gibt es da Ausnahmeregelungen???
|
Es gibt Systeme, wo das nicht so ist. Aber das ist keine Ausnahmeregelung,
sondern ganz normal.
| Quote: | Wie kann es dann sein, dass sizeof(&Class::Member) bei mir 8 zur�ck
gibt???
|
Falls Class::Member nicht static ist, hast du hier einen Zeiger auf Member.
Die funktionieren sowieso anders als normale Zeiger.
| Quote: | Speziell bei MSVC. Gibt es da eine Einstellungsm�glichkeit?
Danke f�r jeden Betrag, da wir hier einen Bug (was hiermit zusammenh�ngt)
entfernen m�ssen!
|
Wenn du Annahmen über die Größe eines Zeigers machst, ist das wahrscheinlich
ein Bug, ja. |
|
| Back to top |
|
 |
Thomas Richter Guest
|
Posted: Wed Dec 10, 2008 3:32 am Post subject: Re: Gibt es dafür eine logische Erkläru ng??? |
|
|
Michael Sabo wrote:
| Quote: | Hi
Zeiger sollten doch auf einem 32-Bit-System doch 32-Bit sein (also 4 Bytes)
und auf einem 64-Bit-System 64 Bit (also 8 Bytes), oder gibt es da
Ausnahmeregelungen???
|
Das hängt vom Compiler und der Maschine ab. Seltsame Architekturen (und
dazu gehörten früher auch PCs mit der Segmentaddressierung) konnten für
Zeiger auch seltsame Darstellungen haben. Heute ist das einfacher
geworden, und Deine Annahme ist richtig.
| Quote: | Wie kann es dann sein, dass sizeof(&Class::Member) bei mir 8 zurück gibt???
|
Weil das kein Zeiger ist. Sondern ein Zeiger auf ein Klassen-Member, was
ein ganz anderes Ding ist. Es braucht hierzu erst wieder ein Objekt, um
es zu einem Zeiger zu machen. &Class::Member ist am ehesten mit einem
Offset zu vergleichen, der zu einer noch zu gebenden Basisaddresse zu
addieren ist, um einen Zeiger zu erhalten. Zusätzlich hebt der Compiler
hier noch Informationen auf über was für ein Objekt geredet wird - ist
"Class" etwa irgendwo verborgen in einer komplexen Vererbungshierarchie
hängt es von dem jeweiligen Objekt (bzw. seinem Typ) ab, was der genaue
Offset nun werden soll.
| Quote: | Speziell bei MSVC. Gibt es da eine Einstellungsmöglichkeit?
|
Vermutlich. Aber, warum ist die Größe des Zeigers auf Member
entscheident? Oder viel wichtiger, weißt Du genau, dass Du dieses
Konstrukt brauchst? Meiner Erfahrung nach sind "Zeiger auf Member"
selten wirklich hilfreich. Ich brauche meist einen Pointer auf ein
Member eines konkreten Objektes, und nicht auf ein Member einer Klasse.
Grüße,
Thomas |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Wed Dec 10, 2008 8:58 am Post subject: Re: Gibt es dafür eine logische Erklärung??? |
|
|
On Dec 9, 10:04 am, "Michael Sabo" <Michael.S...@gmx.de> wrote:
| Quote: | Zeiger sollten doch auf einem 32-Bit-System doch 32-Bit sein
(also 4 Bytes) und auf einem 64-Bit-System 64 Bit (also 8
Bytes), oder gibt es da Ausnahmeregelungen???
|
Wer weiß? Was beudet »32-Bit-System«? Und soll ein Zeiger auf
einem 8-Bit-System lediglich 8 Bit sein? (Wenn man 32-Bit-System
sagt, meint man meistens die Breite der Register, mindestens
heute. Was eigentlich wenig mit der Breite eines bestimmten Typs
zu tun hat.)
In der Praxis arbeite ich heuter fast ausschließlich auf 64-Bit
Systemen, mit aber 32-Bit Zeigern. In der Vergangenheit aber
habe ich viel auf 8-Bit Systemen mit 16-Bit Zeigern, und 16-Bit
Systemen mit 16- und 32-Bit Zeigern.
| Quote: | Wie kann es dann sein, dass sizeof(&Class::Member) bei mir 8
zurück gibt???
|
Weil der Compiler es so implementiert hat. Nichts sagt, dass
alle Zeiger dieselbe Breite haben, und Zeiger auf Mitgliedern
sind sowieso ganz anders, als andere Zeiger. Die Norm
garantiert, dass char* und void* dieselben Darstellungen haben,
und (indirekt), dass alle Zeiger auf Funktionnen und alle Zeiger
auf Klassen dieselben Darstellungen haben. Mehr nichts. In der
Praxis kommt es wohl vor, dass sizeof(int*) != sizeof(char*),
und es war früher sogar häufig, dass Funktionszeiger eine andere
Größe hatten, als Datenzeiger. Und auch Heute habe Zeiger auf
Datenmitglieder und Zeiger auf Funktionsmitglieder
unterschiedenen Grössen. (Zeiger auf Funktionsmitglieder müssen
mit virtuellen Funktionen auch auskommen.)
| Quote: | Speziell bei MSVC. Gibt es da eine Einstellungsmöglichkeit?
|
Das Kenne ich nicht. Ich habe ihn nur als 32-Bit Compiler
verwendet. Dagegen wieß ich, dass man braucht eine besondere
Option (/vmg), damit Zeiger auf Funktionsmitgliedern
funktionnieren.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Michael Sabo Guest
|
Posted: Wed Dec 10, 2008 2:23 pm Post subject: Re: Gibt es dafür eine logische Erklärung??? |
|
|
| Quote: | Gibt unter gcc 4,4,8,4 bzw 8,8,16,8 aus.
Habe eine gute Page gefunden - aber leider zu spät... (nach dem Posting) |
--> http://www.codeproject.com/KB/cpp/FastDelegate.aspx
Aber vielen Dank!
Man sieht wieder mal - man lernt nie aus... ;)
| Quote: | Wenn ihr annehmt, dass ein Pointer-To-Member-Function so groß ist wie
ein Zeiger, habt ihr ein Design-Problem.
War im Grunde genommen eine externe Komponente welche C# delegates nachahmt |
War echt Tricky zu finden, jedoch (nun) logisch warum er in der
Compare-Methode gekracht ist wenn beide Zeiger eine unterschiedliche Größe
haben können.
Habe es dahingehend erweitert, dass zuvor erst mal die Größe des Pointers
bestimmt wird und wenn diese nicht gleich sind von beiden Objekten, dann
kann es nicht der gleiche Zeiger sein. Somit braucht dann auch kein cast
gemacht werden.
Aber Danke nochmals |
|
| Back to top |
|
 |
Powered by phpBB © 2001, 2006 phpBB Group
|