C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Gibt es dafür eine logische Erklärung???

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Michael Sabo
Guest





PostPosted: Tue Dec 09, 2008 3:04 pm    Post subject: Gibt es dafür eine logische Erklärung??? Reply with 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???
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





PostPosted: Tue Dec 09, 2008 11:44 pm    Post subject: Re: Gibt es dafür eine logische Erklärung??? Reply with quote



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





PostPosted: Wed Dec 10, 2008 12:36 am    Post subject: Re: Gibt es daf�r eine logische Erkl�rung??? Reply with quote



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





PostPosted: Wed Dec 10, 2008 3:32 am    Post subject: Re: Gibt es dafür eine logische Erkläru ng??? Reply with quote

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





PostPosted: Wed Dec 10, 2008 8:58 am    Post subject: Re: Gibt es dafür eine logische Erklärung??? Reply with quote

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





PostPosted: Wed Dec 10, 2008 2:23 pm    Post subject: Re: Gibt es dafür eine logische Erklärung??? Reply with quote

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
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
 


Powered by phpBB © 2001, 2006 phpBB Group