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 

sizeof(long) == sizeof(void*) ?
Goto page 1, 2, 3, 4, 5  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Markus Breuer
Guest





PostPosted: Wed Dec 03, 2003 9:17 am    Post subject: sizeof(long) == sizeof(void*) ? Reply with quote



Ich meine mich zu erinnern im Zusammenhang mit ANSI C gelesen zu haben,
dass der Datentyp long garantiert einen Zeiger aufnehmen kann. Ein
Zeiger kann somit jederzeit in einen long gecastet und verlustfrei
zurück gecastet werden.

Stimmt diese Aussage in iso C++ auch?

Lässt sich daraus der Umkehrschluss ziehen, dass ein Zeiger stets auch
einen long aufnehmen kann? Oder schliesst der C++ Standard nicht aus,
dass ein long ein größeres Fassungvermögen hat, als ein Zeiger?

Gruß Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Markus Schaaf
Guest





PostPosted: Wed Dec 03, 2003 9:29 am    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote



"Markus Breuer" <markus.breuer (AT) gmx (DOT) de> schrieb:

Quote:
Ich meine mich zu erinnern im Zusammenhang mit ANSI C gelesen zu haben,
dass der Datentyp long garantiert einen Zeiger aufnehmen kann. Ein
Zeiger kann somit jederzeit in einen long gecastet und verlustfrei
zurück gecastet werden.

Stimmt diese Aussage in iso C++ auch?

Weder für C, noch für C++.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Breuer
Guest





PostPosted: Wed Dec 03, 2003 11:11 am    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote



Markus Schaaf schrieb:

Quote:
"Markus Breuer" <markus.breuer (AT) gmx (DOT) de> schrieb:


Ich meine mich zu erinnern im Zusammenhang mit ANSI C gelesen zu haben,
dass der Datentyp long garantiert einen Zeiger aufnehmen kann. Ein
Zeiger kann somit jederzeit in einen long gecastet und verlustfrei
zurück gecastet werden.

Stimmt diese Aussage in iso C++ auch?


Weder für C, noch für C++.

Zumindest für C++ habe ich folgenden Abschnitt im Standard gefunden:

5.2.10 Reinterpret cast / Absatz 5:

A value of integral type or enumeration type can be explicitly converted
to a pointer.64) A pointer converted
to an integer of sufficient size (if any such exists on the
implementation) and back to the same pointer type
will have its original value; mappings between pointers and integers are
otherwise implementationdefined.

64) Converting an integral constant expression (5.19) with value zero
always yields a null pointer (4.10), but converting other expressions
that happen to have value zero need not yield a null pointer.

Soweit ich das verstehe, kann ein Pointer in einen (long)int Datentyp
konvertiert werden. Ist der (long) int zu klein, kann der Pointer
trotzdem komplett Wiederhergestellt werden. Wie kann das gehen?

Gruß Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Stefan Reuther
Guest





PostPosted: Wed Dec 03, 2003 11:28 am    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote

Hallo,

Markus Breuer <markus.breuer (AT) gmx (DOT) de> wrote:
Quote:
Zumindest für C++ habe ich folgenden Abschnitt im Standard gefunden:

5.2.10 Reinterpret cast / Absatz 5:

A value of integral type or enumeration type can be explicitly
converted to a pointer.64) A pointer converted to an integer of
sufficient size (if any such exists on the implementation) and back
to the same pointer type will have its original value; mappings
between pointers and integers are otherwise implementationdefined.

Soweit ich das verstehe, kann ein Pointer in einen (long)int Datentyp
konvertiert werden. Ist der (long) int zu klein, kann der Pointer
trotzdem komplett Wiederhergestellt werden. Wie kann das gehen?

Nein. Ist der `long' zu klein, ist es kein `integer of
sufficient size' mehr. Es wird auch nicht gefordert, daß so
ein Typ existiert. In C99 gibt es dafür `intptr_t' aus <stdint.h>,
der nicht zwingend existieren muß.

Obligatorisches Beispiel: i386 im 32-bit segmentierten Protected
Mode. Ein Zeiger ist dann 48 Bit groß (ich weiß allerdings nicht, ob
es einen Compiler gibt, der dieses Speichermodell unterstützt. Watcom
vielleicht?). Castest du das in einen `long', geht Information
verloren. Castest du zurück, ist der neue Zeiger unbrauchbar.

Falls du tatsächlich einen Integer brauchst, kannst du dir `intptr_t'
ansonsten ganz leicht selber bauen:

template<bool b, typename a, typename b>
struct if_then_else { typedef a value; };
template<typename a, typename b>
struct if_then_else<false,a,b> { typedef b value; };

struct undef;

template<int n>
struct sized_int {
typedef typename if_then_else<n == sizeof(long), long,
if_then_else if_then_else if_then_else
Quote:
::value
::value
::value value;
};


typedef sized_int<sizeof(void*)>::value intptr_t;


Stefan, Template-Fan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Wed Dec 03, 2003 12:06 pm    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote

"Stefan Reuther" <stefan.news (AT) expires-2004-01-31 (DOT) arcornews.de> schrieb:

Quote:
template<bool b, typename a, typename b
struct if_then_else { typedef a value; };
template struct if_then_else
struct undef;

template<int n
struct sized_int {
typedef typename if_then_else if_then_else if_then_else if_then_else ::value
::value
::value value;
};

typedef sized_int<sizeof(void*)>::value intptr_t;

Nichts gegen lustige Templates, aber was soll der Quatsch? Erstens kann
<boost/integer.hpp> das besser. Zweitens, bei welcher Architektur ist ein
Zeiger kleiner als ein »int«? Drittens hält das Obige auf etlichen 64-Bit-
Compilern nicht. Viertens gibt »sizeof« nicht den Wertebereich eines
Typen an.

MfG

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Wed Dec 03, 2003 12:12 pm    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote

Markus Breuer wrote:

Quote:
Markus Schaaf schrieb:

"Markus Breuer" <markus.breuer (AT) gmx (DOT) de> schrieb:


Ich meine mich zu erinnern im Zusammenhang mit ANSI C gelesen zu
haben, dass der Datentyp long garantiert einen Zeiger aufnehmen kann.
Ein Zeiger kann somit jederzeit in einen long gecastet und
verlustfrei zurück gecastet werden.

Stimmt diese Aussage in iso C++ auch?


Weder für C, noch für C++.

Zumindest für C++ habe ich folgenden Abschnitt im Standard gefunden:

5.2.10 Reinterpret cast / Absatz 5:

A value of integral type or enumeration type can be explicitly
converted to a pointer.64) A pointer converted
to an integer of sufficient size (if any such exists on the
implementation) and back to the same pointer type
will have its original value; mappings between pointers and integers
are otherwise implementationdefined.

64) Converting an integral constant expression (5.19) with value zero
always yields a null pointer (4.10), but converting other expressions
that happen to have value zero need not yield a null pointer.

Soweit ich das verstehe, kann ein Pointer in einen (long)int Datentyp
konvertiert werden. Ist der (long) int zu klein, kann der Pointer
trotzdem komplett Wiederhergestellt werden. Wie kann das gehen?

Wie hast du das denn da rausgelesen? Oben steht doch explizit, daß das
nur für Integertypen funktioniert, die "of sufficient size" sind. Ist
der long zu klein, geht es nicht.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Stefan Reuther
Guest





PostPosted: Wed Dec 03, 2003 12:33 pm    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote

Hallo,

Markus Schaaf <markus (AT) sags-per-mail (DOT) de> wrote:
Quote:
"Stefan Reuther" <stefan.news (AT) expires-2004-01-31 (DOT) arcornews.de> schrieb:
[...]
typedef typename if_then_else<n == sizeof(long), long,
if_then_else if_then_else if_then_else ::value
::value
::value value;
[...]


Quote:
Nichts gegen lustige Templates, aber was soll der Quatsch? Erstens kann
boost/integer.hpp> das besser.

Definiere "besser". <boost/integer.hpp> macht jedenfalls nicht
das gleiche. <boost/cstdint.hpp> macht häßliche Makrospiele.

Quote:
Zweitens, bei welcher Architektur ist ein Zeiger kleiner als
ein »int«?

Die Norm fordert nicht das Gegenteil, also kann man den Fall
durchaus berücksichtigen, wenn's nix kostet.

Quote:
Drittens hält das Obige auf etlichen 64-Bit-Compilern nicht.

Wenn `long' dort nur 32 Bit hat, kommt man portabel auch an
keinen größeren Typ. An der Stelle hat Boost bestenfalls den
Vorteil, daß es auch unportable Konstrukte nett verpackt.

Quote:
Viertens gibt »sizeof« nicht den Wertebereich eines Typen an.

Es ging um einen `integer of sufficient size'. Damit kann
eigentlich nur `sizeof(integer_typ) >= sizeof(pointer_typ)'
gemeint sein (weswegen man ansonsten meinen Code auch besser mit
`<=' und "andersrum" (char zuerst probieren) aufschreiben
sollte). Ein Integertyp, der mehr als 1 Byte belegt, kann zwar
Bits haben, die nicht zur Wertrepräsentation beitragen oder gar
eine Trap-Representation bilden. Da man an diese Informationen
aber nicht rankommt (oder wie sonst als mit `sizeof' soll man
prüfen, ob es einen `integer of sufficient size' gibt?), bleibt
einem gar nichts anderes übrig als Code wie meiner. Aber solche
Integer dürften in der Praxis noch seltener sein als Zeiger
kleiner als `int'.


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Tibor Pausz
Guest





PostPosted: Wed Dec 03, 2003 1:01 pm    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote

Markus Breuer <markus.breuer (AT) gmx (DOT) de> wrote:

Quote:
Ich meine mich zu erinnern im Zusammenhang mit ANSI C gelesen zu haben,
dass der Datentyp long garantiert einen Zeiger aufnehmen kann.

Das stimmt nicht. Gegenbeispiel ist eine UNIX LLP64 Plattform.

Auf der haben die Datentypen folgende Bitgrößen

LLP64
char 8
short 16
int 32
long 32
long long 64
pointer 64

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Wed Dec 03, 2003 1:10 pm    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote

"Stefan Reuther" <stefan.news (AT) expires-2004-01-31 (DOT) arcornews.de> schrieb:

Quote:
Definiere "besser". <boost/integer.hpp> macht jedenfalls nicht
das gleiche.

Eben. Weiterhin kann man es benutzen, um Deine Idee "richtig" umzusetzen.

Quote:
An der Stelle hat Boost bestenfalls den
Vorteil, daß es auch unportable Konstrukte nett verpackt.

Das ist der eigentliche Vorteil. Deswegen verwende ich den Header nicht
direkt in der Boost-Version, sondern in einer eigenen, die für alle
interessanten Plattformen die passenden Typen berücksichtigt.

Quote:
Viertens gibt »sizeof« nicht den Wertebereich eines Typen an.

Es ging um einen `integer of sufficient size'.

Oder "large enough to hold it". Damit ist nicht das Ergebnis von »sizeof«
gemeint!

Quote:
Damit kann
eigentlich nur `sizeof(integer_typ) >= sizeof(pointer_typ)'
gemeint sein

Nein. Es ist gemeint, daß der Integer einen Wertebereich hat, der, beim
(implementationsabhängigen) Mapping von Zeigern auf Integer, eine
bijektive Abbildung gestattet. Das bedeutet vereinfacht (aber nicht ganz
korrekt), daß mindestens so viele Value-Bits im Integer enthalten sein
müssen, wie im Zeiger. Aus dem Ergebnis des »sizeof«-Operators läßt sich
nicht auf die Value-Bits schließen.

Quote:
aber nicht rankommt (oder wie sonst als mit `sizeof' soll man
prüfen, ob es einen `integer of sufficient size' gibt?),

Da man das Mapping nicht kennt, gar nicht. Eine gut Chance hat man, wenn

sizeof(void*) * CHAR_BITS <= std::numeric_limits
ist, aber immernoch keine Garantie.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Breuer
Guest





PostPosted: Wed Dec 03, 2003 1:32 pm    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote

Quote:
Wie hast du das denn da rausgelesen? Oben steht doch explizit, daß das
nur für Integertypen funktioniert, die "of sufficient size" sind. Ist
der long zu klein, geht es nicht.

Mein Fehler! Fälschlicherweise habe ich immer wieder 'insufficient'
gelesen, womit mich die paradoxe Aussage mehr und mehr von diesem
Lesefehler abgelenkt hat! Danke für den Hinweis!

Gruß Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Vinzent 'Gadget' Hoefler
Guest





PostPosted: Wed Dec 03, 2003 1:37 pm    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote

Markus Schaaf wrote:

Quote:
Zweitens, bei welcher Architektur ist ein
Zeiger kleiner als ein »int«?

Es gibt auf jeden Fall DSPs, die mehr Daten- als Addressleitungen
haben.


Vinzent.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Breuer
Guest





PostPosted: Wed Dec 03, 2003 1:48 pm    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote

Rolf Magnus schrieb:

Quote:
Stefan Reuther wrote:

Aber solche Integer dürften in der Praxis noch seltener sein als
Zeiger kleiner als `int'.


Und noch seltener sollte man in der Praxis einen Zeiger überhaupt in
einen Integer und zurück wandeln müssen. Das braucht man doch höchstens
mal bei low-Level-Code in den Betriebssystem-Innereien oder für
schlecht designte Bibliotheken, die sowas fordern. Erstere sind sowieso
plattformabhängig, bei zweiteren ist der Integertyp schon von vorn
herein festgelegt. Wozu also den ganzen Firlefanz?

Das hat nur bedingt etwas mit schlechtem Design zu tun, es gibt einige
asnynchone API's, die beim Aufruf ein Handle (oft vom Typ long)
annehmen. Der Callback aus dem API erfolgt in Bezug auf dieses Handle,
pauschal gesagt kann man so einem request eine response zuordnen.

Üblicherweise wird eine fortlaufende Nummerierung verwendet. Diese kann
unter stark konkorrierenden Bedingungen (sprich Multi-Threading) zu
einem Flaschenhals führen, da die Zuordnungen vor konkurierrenden
Zugriffen geschützt werden müssen.
Hat man die volle Kontrolle und kann ungültige Handles ausschliessen, so
bietet sich die Option Zeiger auf die involvierten Objekte als Handle zu
verwenden. Die Assoziation wird überflüssig und der Flaschenhals gelöst.
Allerdings wirft diese Vorgehensweise die Anfangs gestellte Frage auf! Surprised)

Gruß Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Breuer
Guest





PostPosted: Wed Dec 03, 2003 1:52 pm    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote

Tibor Pausz schrieb:

Quote:
Markus Breuer <markus.breuer (AT) gmx (DOT) de> wrote:


Ich meine mich zu erinnern im Zusammenhang mit ANSI C gelesen zu haben,
dass der Datentyp long garantiert einen Zeiger aufnehmen kann.


Das stimmt nicht. Gegenbeispiel ist eine UNIX LLP64 Plattform.

Auf der haben die Datentypen folgende Bitgrößen

LLP64
char 8
short 16
int 32
long 32
long long 64
pointer 64

Wunderlich, dass eine 64Bit Plattform keine standard 64-Bit Integertypen
zur Verfügung stellt. Aber mit diesem Gegenbeweis muß ich nun nicht
weiter suchen. Danke für den Hinweis!

Gruß Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Wed Dec 03, 2003 1:53 pm    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote

Stefan Reuther wrote:

Quote:
Aber solche Integer dürften in der Praxis noch seltener sein als
Zeiger kleiner als `int'.

Und noch seltener sollte man in der Praxis einen Zeiger überhaupt in
einen Integer und zurück wandeln müssen. Das braucht man doch höchstens
mal bei low-Level-Code in den Betriebssystem-Innereien oder für
schlecht designte Bibliotheken, die sowas fordern. Erstere sind sowieso
plattformabhängig, bei zweiteren ist der Integertyp schon von vorn
herein festgelegt. Wozu also den ganzen Firlefanz?

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Lars Dr366ge
Guest





PostPosted: Wed Dec 03, 2003 2:33 pm    Post subject: Re: sizeof(long) == sizeof(void*) ? Reply with quote

"Markus Schaaf" <markus (AT) sags-per-mail (DOT) de> wrote:

Quote:
Damit kann
eigentlich nur `sizeof(integer_typ) >= sizeof(pointer_typ)'
gemeint sein

Nein. Es ist gemeint, daß der Integer einen Wertebereich hat, der, beim
(implementationsabhängigen) Mapping von Zeigern auf Integer, eine
bijektive Abbildung gestattet.

Wenn ich das richtig verstehe, wird
`sizeof(integer_typ) == sizeof(pointer_typ)' erzwungen wegen der von
dir geforderten Bijektivität. Allerdings habe ich diese Forderung aus
dem Text nicht herausgelesen.

Quote:
Das bedeutet vereinfacht (aber nicht ganz
korrekt), daß mindestens so viele Value-Bits im Integer enthalten sein
müssen, wie im Zeiger. Aus dem Ergebnis des »sizeof«-Operators läßt sich
nicht auf die Value-Bits schließen.

Was zeichnet ein Value-Bit gegenüber einem gemeinen Bit aus?
vermutlich muß ich erst das wissen, um den Unterschied nachvollziehen
zu können.
--
MfG
Lars

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2, 3, 4, 5  Next
Page 1 of 5

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.