definierte und undefinierte Codekonstrukte



  • Hi,

    bei

    struct undef {
    int a;
    char b;
    long c;
    }
    

    ist auch undefiniert, in welcher Reihenfolge die Objecte im Speicher abgelegt werden.
    (daher kann man um alles auf 0 zu setzen nicht die Funktion mamset() benutzen, der man als Startadresse die Adresse von undef.a übergibt, und als Anzahl der zu überschreibenden Bytes sizeof(int) + sizeof(char) + sizeof(int).



  • c++eus schrieb:

    Hi,

    bei

    struct undef {
    int a;
    char b;
    long c;
    }
    

    ist auch undefiniert, in welcher Reihenfolge die Objecte im Speicher abgelegt werden.
    (daher kann man um alles auf 0 zu setzen nicht die Funktion mamset() benutzen, der man als Startadresse die Adresse von undef.a übergibt, und als Anzahl der zu überschreibenden Bytes sizeof(int) + sizeof(char) + sizeof(int).

    das mit den padding bytes stimmt.
    aber es ist schon definiert, dass a vor b vor c kommt. sonst wäre es ja ein blödsinn.



  • Shade Of Mine schrieb:

    c++eus schrieb:

    Hi,

    bei

    struct undef {
    int a;
    char b;
    long c;
    }
    

    ist auch undefiniert, in welcher Reihenfolge die Objecte im Speicher abgelegt werden.
    (daher kann man um alles auf 0 zu setzen nicht die Funktion mamset() benutzen, der man als Startadresse die Adresse von undef.a übergibt, und als Anzahl der zu überschreibenden Bytes sizeof(int) + sizeof(char) + sizeof(int).

    das mit den padding bytes stimmt.
    aber es ist schon definiert, dass a vor b vor c kommt. sonst wäre es ja ein blödsinn.

    wieso?
    es bleibt doch dem Compiler überlassen, inwiefern er das optimiwert.



  • c++eus schrieb:

    wieso?
    es bleibt doch dem Compiler überlassen, inwiefern er das optimiwert.

    klär mich mal auf

    was darf er optimieren?
    padding bytes? ja
    reihenfolge der variablen? nein

    solltest du anderer meinung sein, bitte die stelle im standard angeben, wo das steht. danke.



  • Hi,

    stimmt, der Compiler lässt die Variablen wo sie sind. Er füllt sie lediglich mit Füllbyte auf, um die Variablen an Zweierpotenzen beginnen zu lassen.



  • @c++eus
    Innerhalb eines Access-Levels ist die Reihenfolge der Anordnung von Membern genau definiert. In diesem Fall muss a an einer niedrigeren Adresse als b liegen, welches wiederum vor c liegen muss.



  • wendy schrieb:

    unsigned char c1 = 64;    // wohldefiniert, ein char hat mind 8 Bit
    unsigned char c2 = 1256;    // implementierungsspezifisch
    

    Der Code ist in Ordnung, aber dein Kommentar IMHO nicht. Kann char nicht auch 7 Bits haben? (rein theoretisch, ist heute natürlich Blödsinn.)



  • Ähm ?!
    Soweit ich bis jetzt gelesen (und begriffen) habe,
    ist bei den versch. Typen nur immer die Mindestgrössen
    festgelegt. Die effektive obere Grenze ist dann
    compiler-spezifisch (== implementierungsabhängig ?!).

    Also, ein char ist mind. 8 Bit gross/lang.

    Ich versteh das dann so: 8 gesetzte Bit sind ja nur 255
    und 64 < 255 < 1256, da ja char hier als Zahl betrachtet
    wird.

    ...oder?

    PS.: das war nicht mein Kommentar sondern B. Stroustrup's



  • wendy schrieb:

    Also, ein char ist mind. 8 Bit gross/lang.

    Ich versteh das dann so: 8 gesetzte Bit sind ja nur 255
    und 64 < 255 < 1256, da ja char hier als Zahl betrachtet
    wird.

    Richtig.



  • Muss ein char nach dem Standard also mindestens 8 Bit haben?
    Funktioniert das nicht auch mit 7 Bit, wenn man eine Maschine hat, bei der die Bytes 7 Bit groß sind?



  • Muss ein char nach dem Standard also mindestens 8 Bit haben?

    Yup.

    Funktioniert das nicht auch mit 7 Bit, wenn man eine Maschine hat, bei der die Bytes 7 Bit groß sind?

    Wenn ich mich recht entsinne muss eine solche Maschine in diesem Fall die 8 (oder mehr) Bits in Software simulieren.


Anmelden zum Antworten