Tatsächliche Größe (bytes) einer Struktur herausfinden



  • Hallo,

    hab es schon mit sizeof() versucht.
    Bin mir aber nicht sicher, ob das der tatsächliche Wert (bytes) ist.

    char* date = const_cast<char*>("20091105");
    cout << "date: " << sizeof(date) << endl;
    
    object o = new object;
    ... //die Instanzen von o fuellen
    cout << object: " << sizeof(o)  << endl;
    


  • Manuel_XY schrieb:

    hab es schon mit sizeof() versucht.
    Bin mir aber nicht sicher, ob das der tatsächliche Wert (bytes) ist.

    Was hast Du denn genau ausprobiert? sizeof wäre eigentlich die Antwort gewesen. Vielleicht hast Du es nur falsch angewendet.

    Manuel_XY schrieb:

    char* date = const_cast<char*>("20091105");
    cout << "date: " << sizeof(date) << endl;
    

    Ui! Also der const_cast ist schonmal Mist. sizeof(date) gibt Dir die Größe von date zurück. date ist aber ein Zeiger.

    Manuel_XY schrieb:

    object o = new object;
    ... //die Instanzen von o fuellen
    cout << object: " << sizeof(o)  << endl;
    

    Du meinst wahrscheinlich

    object* o = new object;
    cout << "object: " << sizeof(*o)     << endl;
    cout << "object: " << sizeof(object) << endl;
    

    Auch hier ist o wieder ein Zeiger.

    Gruß,
    SP



  • Schluckt ein Compiler echt einen Const-Cast von String-Literalen?
    Ansonsten kannst du aber davon ausgehen, dass sizeof so ziemlich fast immer die größe in Bytes zurückliefert (laut standard ist eher die Anzahl von char's gemeint oder so, wenn ich mich recht entsinne!)

    Mfg,
    Michael



  • Ich vermute ja, dass Manuels Probleme folgende sind:
    a) Er will die Größe eines Objekts zur Laufzeit, benutzt dazu aber eine Technik, die zur Compilezeit greift - das wird schon prinzipbedingt nicht gehen.
    b) Er will damit Ziele erreichen, für die es deutlich bessere/einfachere Lösungen gibt. Die Größe eines Objekts im Speicher braucht man jedenfalls so gut wie nie (für Aufgabenstellungen, die jemand bewältigen kann, der sizeof() nicht wirklich kennt 😉 )...

    Manuel: Sag dochmal, wofür Du das zu brauchen glaubst.

    Ansonsten noch 2 Korrekturen:
    1.) const_cast ist ein extrem wildes Tier - wenn man das braucht, ist das eine seeeehr seltene/gefährliche/wohlüberlegte Angelegenheit. Und das trifft auf die Initialisierung mit einem Literal garantiert nicht zu.
    Ich würde Dir raten, nicht "rumzufrickeln, bis es zu laufen scheint", sondern kurz zu recherchieren, was das Problem wirklich darstellt. Hier wäre es so einfach gewesen:

    char const* date = "20091105";
    

    Prima, oder? 😉
    Oder noch einfacher:

    string const date = "20091105";
    

    Da brauchst Du auch kein sizeof, sondern bekommst die Länge einfach mit

    cout << date.size();
    // oder:
    cout << date.length(); // identisch zu size()
    

    Willst Du den Wert von date irgendwann mal ändern, lässt Du einfach (NUR in der string-Variante!!!) das const weg und fertig.

    2.)

    Manuel_XY schrieb:

    ...

    ... //die Instanzen von o fuellen
    

    Du meinst vermutlich "Member"/"Elemente"/"Attribute"/...
    "Instanz" ist ein klar definierter Begriff, der hier einfach nicht passt.
    BTW: Dies ist eine gute Gelegenheit, mal zu recherchieren,
    - was ein "Konstruktor" ist und
    - warum man Objekte nur sehr selten dynamisch (=per new) anlegt und was man dabei beachten müsste.
    😉

    Gruß,

    Simon2.



  • "Tatsächliche Größe (bytes) einer Struktur herausfinden"
    geht allg. nur, wenn keine pointer im spiel sind...
    weil sizeof dann(wie bereits gesagt), nur die größe auf dem festspeicher(stack) zurückgibt.

    was möchtest du denn damit anstellen?

    bb



  • Zunächst einmal Danke für die vielen Antworten.

    Ich versuche Größe des zuverschickenden Objekts herauszufinden.
    Siehe dazu diesen Thread:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1788581.html#1788581

    Ich habe hier einen WebService (Server). Dieser bekommt keine Objekte zugeschickt.
    Was ich mit Etherape (Sniffer) sehe, ist die Größe der Daten was der Client verschickt.
    Ich kann die Typen der Member nicht einfach ändern, die sind vom WebService als (meist) char* vorgegeben. Aus diesem Grund das const_cast<char*>.

    So sieht dder Aufbau des zuverschickenden Objects aus.
    (ich weiß es ist ein Krampf, aber ich hab den WebService nicht entwickelt,
    muss ihn aber verwenden... 😞 )

    _ns1__test* a = new _ns1__test;
    a->incomingTests = new ns1__ArrayOfTests;
    a->incomingTests->Tests = new ns1__Tests*[1];
    a->incomingTests->Tests[0] = new ns1__Tests;
    a->incomingTests->Tests[0]->testin = new ns1__TestIn;
    a->incomingTests->Tests[0]->testin->id = "asdf";
    

    Ich möchte die Größe von "a" wissen nachdem es mit asdf gefüllt wurde.
    Bin mir nämlich nicht sicher ob a nicht einfach leer ist, oder wirklich
    die rekursiven Objekte enthält.



  • Ich möchte die Größe von "a" wissen nachdem es mit asdf gefüllt wurde.
    Bin mir nämlich nicht sicher ob a nicht einfach leer ist, oder wirklich
    die rekursiven Objekte enthält.

    was erhoffst du dir davon?

    ansonsten hf bei so ner lib xD
    kann mir gerade nur schwerlich vorstellen, dass man die nicht auch besser/einfacher verwenden kann...

    a->incomingTests->Tests = new ns1__Tests*[1];
    a->incomingTests->Tests[0] = new ns1__Tests;
    

    Sieht so gar falsch aus...

    bb



  • Was ich mir davon erhoffe:
    So kann ich die Größe der verschickten Daten ungefähr einschätzen mit der Größe des zuverschickenden Objekts. Oder auf gut deutsch: ob die Daten, die ich verschicken will, in den tatsächlich verschickten Daten darin sind.



  • [quote="unskilled"]

    Sieht so gar falsch aus...

    int soap_call___ns1__test(
        struct soap *soap,
        NULL, // char *endpoint = NULL selects default endpoint for this operation
        NULL, // char *action = NULL selects default action for this operation
        _ns1__test*                          ns1__test,
    );
    
    /// "testService":test is a complexType.
    class _ns1__test
    { public:
    /// Element incomingTests of type "testService":ArrayOfTests.
        ns1__ArrayOfTests*                    incomingTests                   1;    ///< Required element.
    /// A handle to the soap struct that manages this instance (automatically set)
        struct soap                         *soap                          ;
    };
    
    /// "testService":ArrayOfTests is a complexType.
    class ns1__ArrayOfTests
    { public:
    /// Size of array of ns1__Tests* is 0..unbounded
        int                                  __sizeTests                    ;
    /// Pointer to array of length 0..unbounded
        ns1__Tests*                          *Tests                           0;    ///< Nullable pointer.
    /// A handle to the soap struct that manages this instance (automatically set)
        struct soap                         *soap                          ;
    };
    
    /// "testService":Tests is a complexType.
    class ns1__Tests
    { public:
    /// Element testin of type "testService":TestIn.
        ns1__TestIn*                          testin                          1;    ///< Nullable pointer.
    /// A handle to the soap struct that manages this instance (automatically set)
        struct soap                         *soap                          ;
    };
    
    /// "testService":TestIn is a complexType.
    class ns1__TestIn
    { public:
    /// Element uniqueid of type xs:string.
        char*                                id                       1;    ///< Nullable pointer.
    /// A handle to the soap struct that manages this instance (automatically set)
        struct soap                         *soap                          ;
    };
    

Anmelden zum Antworten