datentyp für zeiger



  • hi

    gibts in der stl nen datentyp der integral ist aber immer exakt gleich gross wie ein zeiger ist?



  • Wozu brauchst du es denn?

    PS: Ich bin mir nicht 100% sicher, aber evenuell könnten size_t und ptrdiff_t die richtige Größe haben.



  • CStoll schrieb:

    PS: Ich bin mir nicht 100% sicher, aber evenuell könnten size_t und ptrdiff_t die richtige Größe haben.

    Bin mir auch nicht sicher. Da man nur Zeiger verrechnen kanndarf, die in den selben zusammenhängenden Speicherbereich zeigen, wären durchaus lange Zeiger mit kurzen size_t&ptrdiff_t denkbar. Ich denke dabei an die Speichermodelle medium und large.



  • lol_of_lolcraft schrieb:

    gibts in der stl nen datentyp der integral ist aber immer exakt gleich gross wie ein zeiger ist?

    In der STL nicht aber in der STD allgemein meinem Wissen nach schon: std::size_t



  • In C99 und C++2011 gibt's <stdint.h>, welcher -- falls es einen solchen Integer-Typen gibt -- typedefs für intptr_t und uintptr_t enthält.



  • In C++11 heißt der Header allerdings <cstdint> soweit ich weiß.



  • Es gibt <cstdint>, ja. Und <stdint.h> auch. Ich war am überlegen, ob ich <cstdint> im obigen Post noch extra erwähnen sollte. Aber jetzt, wo Du es schon mal angerissen hast ...

    Annex
    D.5 C Standard library headers

    For compatibility with the C standard library and the C Unicode TR, the C++ standard library provides the 25 C headers, as shown in table 154.

    Table 154 - C headers
    <assert.h> <inttypes.h> <signal.h> <stdio.h> <wchar.h>
    <complex.h> <iso646.h> <stdalign.h> <stdlib.h> <wctype.h>
    <ctype.h> <limits.h> <stdarg.h> <string.h>
    <errno.h> <locale.h> <stdbool.h> <tgmath.h>
    <fenv.h> <math.h> <stddef.h> <time.h>
    <float.h> <setjmp.h> <stdint.h> <uchar.h>

    kk



  • Vermutlich wird intptr_t in der Zukunft der eine wahre Weg sein - ich kann mir nur sehr esoterische Gründe vorstellen, aus denen ein Compiler dieses Typedef nicht anbieten könnte, und alle setzen voraus, dass keiner der Integertypen einen Zeiger vollständig darstellen kann (ich denke da an eine Situation wie auf den alten 16-Bit-Maschinen mit Speichersegmenten).

    Bis dahin kann man sich mit Boost.MPL behelfen:

    include <boost/mpl/find_if.hpp>
    #include <boost/mpl/vector.hpp>
    
    #include <iostream>
    #include <typeinfo>
    
    template<typename T> struct has_pointer_size { static bool const value = sizeof(T) == sizeof(void*); };
    
    typedef boost::mpl::vector<char, short, int, long> integral_types;
    typedef boost::mpl::find_if<integral_types, has_pointer_size<boost::mpl::_1> >::type intptr_iterator;
    typedef boost::mpl::deref<intptr_iterator>::type intptr_t;
    
    int main() {
      std::cout << typeid(intptr_t).name() << std::endl;
    }
    

    ...oder darauf vertrauen, dass ptrdiff_t schon groß genug sein wird. Auch wenn das vom Standard ausdrücklich nicht verlangt wird, dürfte es in der Praxis (fast) immer der Fall sein.



  • Bis dahin kann man sich mit Boost.MPL behelfen:

    Da lieber gleich <boost/cstdint.hpp> 😉



  • Da ist leider kein intptr_t drin.

    (So richtig ernst war der MPL-Vorschlag aber trotzdem nicht gemeint)


Log in to reply